@read-frog/api-contract 0.22.0 → 0.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +182 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +144 -121
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/public-errors.ts +7 -1
- package/src/schemas/hosted-ai.ts +26 -4
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["cardStateSchema","scheduleStatusSchema"],"sources":["../src/schemas/hosted-ai.ts","../src/public-errors.ts","../src/schemas/app-locale.ts","../src/schemas/billing.ts","../src/contracts/billing.ts","../src/contracts/shared.ts","../src/schemas/pagination.ts","../src/schemas/resource-mutation.ts","../src/schemas/card.ts","../src/contracts/card.ts","../src/contracts/card-template.ts","../src/schemas/ebook.ts","../src/contracts/ebook.ts","../src/schemas/email-preferences.ts","../src/contracts/email-preferences.ts","../src/schemas/feature-access.ts","../src/contracts/feature-access.ts","../src/contracts/hosted-ai.ts","../src/schemas/mastery-goal.ts","../src/contracts/mastery-goal.ts","../src/schemas/mcp-connection.ts","../src/contracts/mcp-connection.ts","../src/schemas/notebase-column.ts","../src/schemas/notebase-row.ts","../src/schemas/notebase-view.ts","../src/schemas/notebase.ts","../src/contracts/notebase.ts","../src/contracts/notebase-column.ts","../src/contracts/notebase-row.ts","../src/schemas/speech.ts","../src/contracts/speech.ts","../src/schemas/timezone.ts","../src/schemas/srs.ts","../src/contracts/srs.ts","../src/schemas/notebase-stats.ts","../src/schemas/srs-stats.ts","../src/schemas/stats.ts","../src/contracts/stats.ts","../src/schemas/user.ts","../src/contracts/user.ts","../src/schemas/video-transcript.ts","../src/contracts/video-transcript.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const HostedAiOutputFieldTypeSchema = z.enum([\"string\", \"number\"]);\n\nexport const HostedAiOutputFieldSchema = z.strictObject({\n name: z.string().trim().min(1).max(80),\n type: HostedAiOutputFieldTypeSchema,\n});\n\nconst HostedAiInstructionsSchema = z.string().trim().min(1).max(16000);\n\n/**\n * Which hosted model a request runs on. Deliberately NOT named after a billing\n * plan: which plans may reach which tier is policy (see `access-policy.ts`),\n * not identity, so a future plan can be sold with any tier without a rename.\n */\nexport const HostedAiModelTierSchema = z.enum([\"normal\", \"advance\"]);\n/**\n * The billing/access subject of a hosted request, not a route id. Sub-calls\n * bill against the feature they serve: the page summary is `pageTranslation`,\n * and the video summary and subtitle segmentation are `videoSubtitles`.\n *\n * Appended last on purpose: the db pgEnum mirrors this order, and appending\n * keeps drizzle from emitting the ADD VALUE ... BEFORE variant.\n */\nexport const HostedAiFeatureSchema = z.enum([\n \"pageTranslation\",\n \"customAction\",\n \"noteSuggestion\",\n \"selectionTranslation\",\n \"videoSubtitles\",\n \"inputTranslation\",\n \"languageDetection\",\n]);\nexport const HostedAiRequestIdSchema = z.uuid();\n\nconst HostedAiRequestMetadataSchema = {\n /**\n * Optional on the wire, always present after parsing: these endpoints shipped\n * before tiers existed, so every installed extension below 1.46.0 sends no\n * `modelTier` at all, and the input objects are strict. Defaulting here keeps\n * those clients working while giving handlers a single source of truth\n * instead of a `?? \"normal\"` at every call site.\n *\n * TODO(2026-11-01): Drop the default and make this required once extensions\n * below 1.46.0 have drained from the store.\n */\n modelTier: HostedAiModelTierSchema.default(\"normal\"),\n requestId: HostedAiRequestIdSchema.optional(),\n};\n\nexport const HostedAiStreamTextInputSchema = z.strictObject({\n ...HostedAiRequestMetadataSchema,\n instructions: HostedAiInstructionsSchema,\n prompt: z.string().trim().min(1).max(32000),\n temperature: z.number().min(0).max(2).optional(),\n});\n\nexport const HostedAiStreamStructuredObjectInputSchema = z\n .strictObject({\n ...HostedAiRequestMetadataSchema,\n instructions: HostedAiInstructionsSchema,\n prompt: z.string().trim().min(1).max(32000),\n outputSchema: z.array(HostedAiOutputFieldSchema).min(1).max(32),\n temperature: z.number().min(0).max(2).optional(),\n })\n .superRefine((input, ctx) => {\n const fieldNames = new Set<string>();\n\n input.outputSchema.forEach((field, index) => {\n if (fieldNames.has(field.name)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Duplicate output schema name \"${field.name}\".`,\n path: [\"outputSchema\", index, \"name\"],\n });\n return;\n }\n\n fieldNames.add(field.name);\n });\n });\n\nexport const HOSTED_AI_NOTE_SUGGESTION_MAX_NOTES = 2;\nexport const HOSTED_AI_NOTE_SUGGESTION_MAX_NOTE_FIELDS = 16;\n\nexport const HostedAiNoteSuggestionStreamInputSchema = z.strictObject({\n ...HostedAiRequestMetadataSchema,\n instructions: HostedAiInstructionsSchema,\n prompt: z.string().trim().min(1).max(32000),\n temperature: z.number().min(0).max(2).optional(),\n});\n\n/**\n * Fixed structured-output schema for hosted note suggestions. Must stay\n * strict-structured-outputs-safe: strict objects only, no records, no\n * `.optional()` (nullable-only), unions limited to primitives. If the upstream\n * deployment rejects `maxItems`/`maxLength` constraint keywords, strip the\n * `.max()` calls from the model-facing copy only — clients still validate\n * against this schema.\n */\nexport const HostedAiNoteSuggestionObjectSchema = z.strictObject({\n action: z.strictObject({\n createNewDictionaryAction: z.boolean(),\n targetActionId: z.string().max(128).nullable(),\n /**\n * Name of the chosen schema's field whose value best works as a one-line\n * explanation of the term in UI (usually a definition/meaning field);\n * null when no field fits. Purely a display hint — clients sanitize it\n * and fall back to their own ordering when invalid.\n */\n summaryFieldName: z.string().max(80).nullable(),\n }),\n notes: z\n .array(\n z.strictObject({\n fields: z\n .array(\n z.strictObject({\n name: z.string().max(80),\n value: z.union([z.string(), z.number()]).nullable(),\n }),\n )\n .max(HOSTED_AI_NOTE_SUGGESTION_MAX_NOTE_FIELDS),\n }),\n )\n .max(HOSTED_AI_NOTE_SUGGESTION_MAX_NOTES),\n});\n\nexport const HostedAiStreamPartSchema = z.looseObject({\n type: z.string().trim().min(1),\n});\n\n/**\n * The only stream part types this API emits. Every other part the AI SDK\n * produces (`start-step`, `finish-step`, `text-start`, ...) carries upstream\n * metadata — provider model id, response headers, request body — and is dropped\n * server-side so it never reaches a client.\n *\n * The consumer switch lives in the extension's background stream reader. Adding\n * a type here without teaching that switch about it is a no-op; removing one\n * breaks rendering. `error` is absent on purpose: it is converted into a thrown\n * error before it can be yielded.\n */\nexport const HOSTED_AI_CLIENT_STREAM_PART_TYPES = [\n \"text-delta\",\n \"reasoning-start\",\n \"reasoning-delta\",\n \"reasoning-end\",\n \"reasoning-file\",\n \"finish\",\n] as const;\n\n/**\n * Status is per-identity, not per-feature: one call reports every feature and\n * every pool, so a client caches a single response instead of one per feature.\n * Non-strict so a client still sending the retired `feature` argument gets a\n * useful response rather than a validation error.\n */\nexport const HostedAiStatusInputSchema = z.object({});\n\nexport const HostedAiUnavailableReasonSchema = z.enum([\n \"authentication_required\",\n \"ultra_required\",\n \"quota_exhausted\",\n \"service_unavailable\",\n]);\n\nexport const HostedAiCreditPolicyIdSchema = z.enum([\n \"custom-action-guest-daily-v1\",\n \"custom-action-user-daily-v1\",\n \"custom-action-pro-daily-v1\",\n \"ultra-weekly-v1\",\n]);\n\nexport const HostedAiCreditPeriodKindSchema = z.enum([\"daily\", \"weekly\"]);\n\nexport const HostedAiQuotaScopeSchema = z.enum([\"guest\", \"user\"]);\n\n/**\n * Data payload of the TOO_MANY_REQUESTS error every hosted AI guard emits.\n * The code itself is ORPC's own rather than a PUBLIC_APP_ERROR_DEFS entry, so\n * this schema is the only contract tying the server's construction to the\n * extension's parsing of it.\n *\n * Deliberately NOT strict: installed extensions parse this payload at runtime\n * and lag server deploys by weeks, so rejecting unknown keys would turn any\n * additive server-side field into a fleet-wide parse failure that silently\n * drops retryAfterMs (queue backoff timing) and quotaScope (guest sign-in\n * prompt). Unknown keys are stripped; the required fields keep drift\n * protection.\n */\nexport const HostedAiRateLimitErrorDataSchema = z.object({\n retryAfterMs: z.number().int().min(0),\n quotaScope: HostedAiQuotaScopeSchema,\n});\n\n/**\n * A recurring pool: the plan's credit for a day or a week, which refills at\n * `resetAt`.\n *\n * Deliberately free of dollar amounts and of the versioned policy id. Clients\n * render a consumption bar and a reset time, so a percentage and a period kind\n * are all they need, and neither leaks what a call costs us. `usedPercent`\n * counts settled spend only: including in-flight reservations would make the\n * bar jump forward and then back as each stream settles.\n */\nexport const HostedAiRecurringCreditStatusSchema = z.strictObject({\n periodKind: HostedAiCreditPeriodKindSchema,\n usedPercent: z.number().min(0).max(100),\n resetAt: z.iso.datetime().nullable(),\n /**\n * Every feature drawing on this pool. Ultra shares one weekly pool across all\n * three, so the grouping lives here rather than inlined per feature — that way\n * a client can tell one shared pool from several separate ones.\n */\n features: z.array(HostedAiFeatureSchema).min(1),\n});\n\n/**\n * A one-time pool, such as credit from a campaign or from support. It never\n * refills: once spent or past `expiresAt` it is gone, so a client shows the\n * expiry, not a reset. It is drawn on only after the plan's own pool for a\n * feature is spent, or for a feature the plan does not fund. Listed until it\n * expires, even when spent. Same fields as a recurring pool otherwise.\n */\nexport const HostedAiOneTimeCreditStatusSchema = z.strictObject({\n periodKind: z.literal(\"once\"),\n usedPercent: z.number().min(0).max(100),\n expiresAt: z.iso.datetime(),\n features: z.array(HostedAiFeatureSchema).min(1),\n});\n\n/**\n * One pool that can pay for Built-in AI, told apart by `periodKind`: a\n * recurring `daily` or `weekly` pool refills at `resetAt`, a one-time (`once`)\n * pool ends at `expiresAt`. Narrow on `periodKind` before reading either.\n */\nexport const HostedAiCreditPoolStatusSchema = z.discriminatedUnion(\"periodKind\", [\n HostedAiRecurringCreditStatusSchema,\n HostedAiOneTimeCreditStatusSchema,\n]);\n\nexport const HostedAiTierStatusSchema = z.strictObject({\n accessAllowed: z.boolean(),\n available: z.boolean(),\n unavailableReason: HostedAiUnavailableReasonSchema.nullable(),\n /**\n * Viewer-independent product fact: no non-Ultra account can ever use this\n * feature/tier, so signing in alone will not unlock it. Unlike the fields\n * above, this does not vary with the caller's identity or plan — clients use\n * it to label Ultra-only options rather than to gate the current user.\n */\n requiresUltra: z.boolean(),\n modelRevision: z.string().trim().min(1),\n});\n\nexport const HostedAiFeatureStatusSchema = z.strictObject({\n normal: HostedAiTierStatusSchema,\n advance: HostedAiTierStatusSchema,\n});\n\nexport const HostedAiStatusOutputSchema = z.strictObject({\n /**\n * @deprecated Read `pools`. This lists the recurring pools only, never a\n * one-time one: extensions released before mengxi-ream/read-frog#2395 look\n * up a label for every entry's `periodKind`, and one they do not know\n * crashes their usage page. They also throw if the field is missing.\n *\n * TODO(2026-11-07): remove once those extensions have drained (#710).\n */\n credits: z.array(HostedAiRecurringCreditStatusSchema),\n /**\n * Everything that can pay for a feature, in the order the server draws on it:\n * the plan's recurring pools first, then one-time pools by soonest expiry. A\n * feature can appear in several entries.\n */\n pools: z.array(HostedAiCreditPoolStatusSchema),\n features: z.strictObject({\n pageTranslation: HostedAiFeatureStatusSchema,\n customAction: HostedAiFeatureStatusSchema,\n noteSuggestion: HostedAiFeatureStatusSchema,\n selectionTranslation: HostedAiFeatureStatusSchema,\n videoSubtitles: HostedAiFeatureStatusSchema,\n inputTranslation: HostedAiFeatureStatusSchema,\n languageDetection: HostedAiFeatureStatusSchema,\n }),\n});\n\nexport type HostedAiOutputFieldType = z.infer<typeof HostedAiOutputFieldTypeSchema>;\nexport type HostedAiOutputField = z.infer<typeof HostedAiOutputFieldSchema>;\nexport type HostedAiModelTier = z.infer<typeof HostedAiModelTierSchema>;\nexport type HostedAiFeature = z.infer<typeof HostedAiFeatureSchema>;\nexport type HostedAiStreamTextInput = z.infer<typeof HostedAiStreamTextInputSchema>;\nexport type HostedAiStreamStructuredObjectInput = z.infer<\n typeof HostedAiStreamStructuredObjectInputSchema\n>;\nexport type HostedAiNoteSuggestionStreamInput = z.infer<\n typeof HostedAiNoteSuggestionStreamInputSchema\n>;\nexport type HostedAiNoteSuggestionObject = z.infer<typeof HostedAiNoteSuggestionObjectSchema>;\nexport type HostedAiStreamPart = z.infer<typeof HostedAiStreamPartSchema>;\nexport type HostedAiStatusInput = z.infer<typeof HostedAiStatusInputSchema>;\nexport type HostedAiUnavailableReason = z.infer<typeof HostedAiUnavailableReasonSchema>;\nexport type HostedAiCreditPolicyId = z.infer<typeof HostedAiCreditPolicyIdSchema>;\nexport type HostedAiCreditPeriodKind = z.infer<typeof HostedAiCreditPeriodKindSchema>;\nexport type HostedAiQuotaScope = z.infer<typeof HostedAiQuotaScopeSchema>;\nexport type HostedAiRateLimitErrorData = z.infer<typeof HostedAiRateLimitErrorDataSchema>;\nexport type HostedAiRecurringCreditStatus = z.infer<typeof HostedAiRecurringCreditStatusSchema>;\nexport type HostedAiOneTimeCreditStatus = z.infer<typeof HostedAiOneTimeCreditStatusSchema>;\nexport type HostedAiCreditPoolStatus = z.infer<typeof HostedAiCreditPoolStatusSchema>;\nexport type HostedAiTierStatus = z.infer<typeof HostedAiTierStatusSchema>;\nexport type HostedAiFeatureStatus = z.infer<typeof HostedAiFeatureStatusSchema>;\nexport type HostedAiStatusOutput = z.infer<typeof HostedAiStatusOutputSchema>;\n","import type { ErrorMap } from \"@orpc/contract\";\nimport { z } from \"zod\";\nimport { HostedAiCreditPolicyIdSchema, HostedAiModelTierSchema } from \"./schemas/hosted-ai\";\n\ninterface PublicAppErrorDefinition {\n data?: z.ZodTypeAny;\n message: string;\n status: number;\n}\n\nexport const CellValidationFailureReasonSchema = z.enum([\n \"unknown_notebase_column\",\n \"type_mismatch\",\n \"invalid_select_option\",\n \"invalid_date_format\",\n]);\nexport type CellValidationFailureReason = z.infer<typeof CellValidationFailureReasonSchema>;\n\nexport const CellValidationFailureDetailsSchema = z\n .object({\n expectedFormat: z.string().optional(),\n expectedType: z.string().optional(),\n receivedType: z.string().optional(),\n receivedValue: z.unknown().optional(),\n validOptions: z.array(z.string()).optional(),\n })\n .strict();\nexport type CellValidationFailureDetails = z.infer<typeof CellValidationFailureDetailsSchema>;\n\nexport const CellValidationFailedDataSchema = z\n .object({\n notebaseColumnId: z.string(),\n details: CellValidationFailureDetailsSchema,\n reason: CellValidationFailureReasonSchema,\n /** Index of the failing row within a batch input (createMany / updateMany / initialRows). */\n rowIndex: z.number().int().min(0).optional(),\n })\n .strict();\nexport type CellValidationFailedData = z.infer<typeof CellValidationFailedDataSchema>;\n\nexport const CardTemplateInvalidColumnsDataSchema = z\n .object({\n notebaseColumnIds: z.array(z.string()),\n })\n .strict();\nexport type CardTemplateInvalidColumnsData = z.infer<typeof CardTemplateInvalidColumnsDataSchema>;\n\nexport const CardTemplateInvalidLayoutDataSchema = z\n .object({\n errors: z.array(\n z\n .object({\n side: z.enum([\"front\", \"back\"]),\n message: z.string(),\n // UTF-16 offsets into that face's layout, when the parser knows them.\n from: z.number().int().min(0).optional(),\n to: z.number().int().min(0).optional(),\n })\n .strict(),\n ),\n })\n .strict();\nexport type CardTemplateInvalidLayoutData = z.infer<typeof CardTemplateInvalidLayoutDataSchema>;\n\n// The templates that use the column, which keep it from being deleted.\nexport const CardTemplateNotebaseColumnInUseDataSchema = z\n .object({\n templates: z.array(z.object({ id: z.uuid(), name: z.string() }).strict()),\n })\n .strict();\nexport type CardTemplateNotebaseColumnInUseData = z.infer<\n typeof CardTemplateNotebaseColumnInUseDataSchema\n>;\n\nexport const HostedAiTierRestrictedDataSchema = z.strictObject({\n modelTier: HostedAiModelTierSchema,\n});\n\nexport const HostedAiQuotaExhaustedDataSchema = z.strictObject({\n modelTier: HostedAiModelTierSchema,\n // Reuses the credit-status enum rather than restating it: these two always\n // describe the same set of policy ids, and a second copy silently drifts —\n // the error payload is `strictObject`, so a policy missing only here fails\n // output validation at exactly the moment a user runs out of credit.\n policyId: HostedAiCreditPolicyIdSchema,\n usedPercent: z.number().min(0).max(100),\n resetAt: z.iso.datetime().nullable(),\n});\n\nexport const SpeechDailyLimitReachedDataSchema = z.strictObject({\n limit: z.number().int().min(0),\n resetAt: z.iso.datetime(),\n});\n\nexport const PUBLIC_APP_ERROR_DEFS = {\n RESOURCE_UPDATE_CONFLICT: {\n message: \"The resource changed. Read it again before updating.\",\n status: 409,\n },\n RESOURCE_ALREADY_EXISTS: { message: \"A resource with this ID already exists.\", status: 409 },\n FIELD_TYPE_CHANGE_UNSUPPORTED: {\n message: \"This operation cannot change the field type.\",\n status: 400,\n },\n HOSTED_AI_TIER_RESTRICTED: {\n data: HostedAiTierRestrictedDataSchema,\n message: \"This Built-in AI tier is not available for this account\",\n status: 403,\n },\n HOSTED_AI_QUOTA_EXHAUSTED: {\n data: HostedAiQuotaExhaustedDataSchema,\n message: \"Built-in AI credit exhausted\",\n status: 429,\n },\n NOTEBASE_NOT_FOUND: {\n message: \"Notebase not found\",\n status: 404,\n },\n VIDEO_TRANSCRIPTION_SUBSCRIPTION_REQUIRED: {\n message: \"AI subtitles require a Pro or Ultra subscription\",\n status: 403,\n },\n // Dunning (`past_due` / `paused`), not cancellation: the account keeps\n // reading subtitles it already paid to generate, but cannot start new work\n // that spends upstream money until the payment method is fixed. Distinct\n // from SUBSCRIPTION_REQUIRED so the client can say \"update your card\"\n // instead of \"subscribe\".\n VIDEO_TRANSCRIPTION_PAYMENT_REQUIRED: {\n message: \"Update your payment method to generate new AI subtitles\",\n status: 402,\n },\n VIDEO_TRANSCRIPT_NOT_FOUND: {\n message: \"Video transcript not found\",\n status: 404,\n },\n VIDEO_TRANSCRIPT_NOT_READY: {\n message: \"Video transcript is not ready yet\",\n status: 409,\n },\n VIDEO_TRANSCRIPTION_QUOTA_EXCEEDED: {\n message: \"Monthly transcription quota exceeded\",\n status: 429,\n },\n // A property of the video, not of the account: upgrading or waiting for the\n // quota to reset changes nothing. Kept apart from QUOTA_EXCEEDED so the\n // client does not answer it with an upgrade wall.\n VIDEO_TRANSCRIPTION_UNSUPPORTED_LENGTH: {\n message: \"This video is longer than AI subtitles support\",\n status: 422,\n },\n // The day's read-aloud requests are used up (`SPEECH_DAILY_REQUEST_LIMITS`).\n SPEECH_DAILY_LIMIT_REACHED: {\n data: SpeechDailyLimitReachedDataSchema,\n message: \"Today's read-aloud limit is reached\",\n status: 429,\n },\n // No voice service to read with right now: not configured, or failing.\n SPEECH_UNAVAILABLE: {\n message: \"Reading aloud is unavailable right now\",\n status: 503,\n },\n NOTEBASE_COLUMN_NOT_FOUND: {\n message: \"Notebase column not found\",\n status: 404,\n },\n NOTEBASE_ROW_NOT_FOUND: {\n message: \"Notebase row not found\",\n status: 404,\n },\n CARD_NOT_FOUND: {\n message: \"Card not found\",\n status: 404,\n },\n CARD_TEMPLATE_NOT_FOUND: {\n message: \"Card template not found\",\n status: 404,\n },\n CARD_TEMPLATE_INVALID_NOTEBASE_COLUMNS: {\n data: CardTemplateInvalidColumnsDataSchema,\n message: \"Card template references unknown notebase columns\",\n status: 422,\n },\n CARD_TEMPLATE_INVALID_LAYOUT: {\n data: CardTemplateInvalidLayoutDataSchema,\n message: \"Card template layout does not parse\",\n status: 422,\n },\n CARD_TEMPLATE_NOTEBASE_COLUMN_IN_USE: {\n data: CardTemplateNotebaseColumnInUseDataSchema,\n message: \"Notebase column is used by a card template\",\n status: 409,\n },\n NOTE_LIMIT_EXCEEDED: {\n message: \"Upgrade is required to create more Notebase notes\",\n status: 403,\n },\n BILLING_NOT_CONFIGURED: {\n message: \"Billing is not configured\",\n status: 503,\n },\n BILLING_CUSTOMER_NOT_FOUND: {\n message: \"Billing customer not found\",\n status: 404,\n },\n BILLING_PASS_ACTIVE: {\n message: \"An active Pro pass already covers this account\",\n status: 409,\n },\n BILLING_CHANGE_SCHEDULED: {\n message: \"A subscription change is already scheduled\",\n status: 409,\n },\n CARD_NOT_REVIEWABLE: {\n message: \"Card cannot be reviewed in its current state\",\n status: 409,\n },\n CARD_REVIEW_STATE_STALE: {\n message: \"Card review state is stale\",\n status: 409,\n },\n CARD_REVIEW_ROLLBACK_UNAVAILABLE: {\n message: \"Card review cannot be rolled back\",\n status: 409,\n },\n CARD_ALREADY_BURIED: {\n message: \"Card is already buried\",\n status: 409,\n },\n CARD_NOT_BURIED: {\n message: \"Card is not buried\",\n status: 409,\n },\n CARD_ALREADY_SUSPENDED: {\n message: \"Card is already suspended\",\n status: 409,\n },\n CARD_NOT_SUSPENDED: {\n message: \"Card is not suspended\",\n status: 409,\n },\n CARD_STATUS_CHANGE_UNAVAILABLE: {\n message: \"Card status change is unavailable\",\n status: 409,\n },\n NOTEBASE_VIEW_NOT_FOUND: {\n message: \"Notebase view not found\",\n status: 404,\n },\n CELL_VALIDATION_FAILED: {\n data: CellValidationFailedDataSchema,\n message: \"Cell validation failed\",\n status: 422,\n },\n PRIMARY_NOTEBASE_COLUMN_DELETE_NOT_ALLOWED: {\n message: \"Cannot delete primary notebase column\",\n status: 400,\n },\n CONCURRENT_POSITION_CONFLICT: {\n message: \"Concurrent position conflict, please retry\",\n status: 409,\n },\n EBOOK_BETA_RESTRICTED: {\n message: \"Ebooks are currently in beta for selected accounts\",\n status: 403,\n },\n EBOOK_NOT_FOUND: {\n message: \"Ebook not found\",\n status: 404,\n },\n EBOOK_LIMIT_EXCEEDED: {\n message: \"Upgrade is required to upload more ebooks\",\n status: 403,\n },\n EBOOK_FILE_TOO_LARGE: {\n message: \"Ebook file exceeds the maximum allowed size\",\n status: 413,\n },\n EBOOK_UPLOAD_NOT_COMPLETED: {\n message: \"Ebook upload has not been completed\",\n status: 409,\n },\n // An email's unsubscribe or preferences link that does not verify, or whose\n // account no longer exists. The page asks the reader to sign in instead.\n EMAIL_LINK_INVALID: {\n message: \"This email link is not valid\",\n status: 400,\n },\n} as const satisfies Record<string, PublicAppErrorDefinition>;\n\nexport type PublicAppErrorCode = keyof typeof PUBLIC_APP_ERROR_DEFS;\n\nexport type PublicAppErrorData<TCode extends PublicAppErrorCode> =\n (typeof PUBLIC_APP_ERROR_DEFS)[TCode] extends { data: infer TSchema extends z.ZodTypeAny }\n ? z.output<TSchema>\n : undefined;\n\nexport function isPublicAppErrorCode(code: string | undefined): code is PublicAppErrorCode {\n return code !== undefined && code in PUBLIC_APP_ERROR_DEFS;\n}\n\nexport function getPublicErrorDefinition<TCode extends PublicAppErrorCode>(code: TCode) {\n return PUBLIC_APP_ERROR_DEFS[code];\n}\n\nexport function pickPublicErrorMap<const TCodes extends readonly PublicAppErrorCode[]>(\n ...codes: TCodes\n) {\n return Object.fromEntries(\n codes.map((code) => {\n const definition = PUBLIC_APP_ERROR_DEFS[code];\n\n if (\"data\" in definition) {\n return [\n code,\n {\n data: definition.data,\n message: definition.message,\n status: definition.status,\n },\n ];\n }\n\n return [\n code,\n {\n message: definition.message,\n status: definition.status,\n },\n ];\n }),\n ) as Pick<ErrorMap, TCodes[number]>;\n}\n","import { z } from \"zod\";\n\n/**\n * The languages the website is in (`project.inlang/settings.json`; a test in\n * apps/www keeps the two in step). Used wherever the server writes for a\n * person: Stripe pages, emails, and the account's `locale`.\n */\nexport const appLocaleSchema = z.enum([\"en\", \"es\", \"ja\", \"ko\", \"ru\", \"tr\", \"vi\", \"zh\", \"zh-TW\"]);\nexport type AppLocale = z.infer<typeof appLocaleSchema>;\n","import type { AppLocale } from \"./app-locale\";\nimport { z } from \"zod\";\nimport { appLocaleSchema } from \"./app-locale\";\n\nexport const billingIntervalSchema = z.enum([\"month\", \"year\"]);\nexport type BillingInterval = z.infer<typeof billingIntervalSchema>;\n\nexport const billingSubscriptionStatusSchema = z.enum([\n \"incomplete\",\n \"incomplete_expired\",\n \"trialing\",\n \"active\",\n \"past_due\",\n \"canceled\",\n \"unpaid\",\n \"paused\",\n]);\nexport type BillingSubscriptionStatus = z.infer<typeof billingSubscriptionStatusSchema>;\n\nexport const billingPlanSchema = z.enum([\"free\", \"pro\", \"ultra\"]);\nexport type BillingPlan = z.infer<typeof billingPlanSchema>;\n\n/**\n * How many MCP tool calls each plan may make in a day (24 hours from the first\n * one); `null` is no limit. Each `tools/call` counts once, whatever the tool.\n *\n * Read by the MCP server's gate AND by the website's copy, so the pages cannot\n * promise calls the server refuses.\n *\n * Companion edit when this changes: the MCP docs under\n * `apps/www/content/docs/mcp/` and `account-and-plans`, which state the numbers.\n */\nexport const MCP_DAILY_CALL_LIMITS = {\n free: 10,\n pro: 50,\n ultra: null,\n} as const satisfies Record<BillingPlan, number | null>;\n\n// Plans a user can actively check out into (the free tier has no price).\nexport const billingCheckoutPlanSchema = z.enum([\"pro\", \"ultra\"]);\nexport type BillingCheckoutPlan = z.infer<typeof billingCheckoutPlanSchema>;\n\nexport const billingCurrencySchema = z.enum([\"usd\", \"cad\", \"cny\"]);\nexport type BillingCurrency = z.infer<typeof billingCurrencySchema>;\n\n// The billing name of `appLocaleSchema`, which it was before the account had a\n// locale of its own; kept so existing imports keep working.\nexport const billingLocaleSchema = appLocaleSchema;\nexport type BillingLocale = AppLocale;\n\nexport const billingAccessSourceSchema = z.enum([\"subscription\", \"pass\"]);\nexport type BillingAccessSource = z.infer<typeof billingAccessSourceSchema>;\n\nexport const billingScheduledChangeSchema = z\n .object({\n plan: billingCheckoutPlanSchema,\n interval: billingIntervalSchema,\n effectiveAt: z.coerce.date(),\n })\n .strict();\nexport type BillingScheduledChange = z.infer<typeof billingScheduledChangeSchema>;\n\n/**\n * The zone a payment deadline is shown in, as a date with no time. UTC−12 is\n * the last zone to finish a day, and `dueBy` is the end of a day there, so the\n * date it shows stays open in every customer's zone until their own midnight.\n */\nexport const BILLING_PAYMENT_DUE_TIME_ZONE = \"Etc/GMT+12\";\n\n/**\n * A renewal whose payment failed. The plan stays until `dueBy`; paying the\n * invoice before then (or later, until the subscription is canceled) restores\n * the subscription as if the payment had gone through.\n */\nexport const billingPaymentDueSchema = z\n .object({\n /** The last instant of the plan; show it in BILLING_PAYMENT_DUE_TIME_ZONE. */\n dueBy: z.coerce.date(),\n /**\n * The plan the payment keeps. Not `BillingStatus.plan`: past `dueBy` that\n * already reads \"free\" while the invoice is still payable.\n */\n plan: billingCheckoutPlanSchema,\n /** The Stripe-hosted page that pays the invoice; null if Stripe gave none. */\n url: z.url().nullable(),\n })\n .strict();\nexport type BillingPaymentDue = z.infer<typeof billingPaymentDueSchema>;\n\nexport const billingStatusSchema = z\n .object({\n plan: billingPlanSchema,\n status: billingSubscriptionStatusSchema.nullable(),\n interval: billingIntervalSchema.nullable(),\n currentPeriodEnd: z.coerce.date().nullable(),\n /**\n * When the subscription terminates, or null if it renews. Replaces the\n * `cancelAtPeriodEnd` boolean: Stripe deprecated its counterpart and the\n * Customer Portal no longer sets it, and the termination date is not always\n * `currentPeriodEnd` — a stacked pass pushes that past the cancellation.\n */\n cancelAt: z.coerce.date().nullable(),\n accessSource: billingAccessSourceSchema.nullable(),\n scheduledChange: billingScheduledChangeSchema.nullable(),\n paymentDue: billingPaymentDueSchema.nullable(),\n unlimitedNotebaseNotes: z.boolean(),\n notebaseNoteLimit: z.number().int().positive(),\n notebaseNoteCount: z.number().int().min(0),\n })\n .strict();\nexport type BillingStatus = z.infer<typeof billingStatusSchema>;\n\nexport const billingCreateCheckoutSessionInputSchema = z\n .object({\n currency: billingCurrencySchema,\n interval: billingIntervalSchema,\n locale: appLocaleSchema,\n plan: billingCheckoutPlanSchema.default(\"pro\"),\n })\n .strict();\nexport type BillingCreateCheckoutSessionInput = z.infer<\n typeof billingCreateCheckoutSessionInputSchema\n>;\n\nexport const billingCreateCustomerPortalSessionInputSchema = z\n .object({\n locale: appLocaleSchema,\n })\n .strict();\nexport type BillingCreateCustomerPortalSessionInput = z.infer<\n typeof billingCreateCustomerPortalSessionInputSchema\n>;\n\nexport const billingSessionUrlOutputSchema = z\n .object({\n url: z.url(),\n })\n .strict();\nexport type BillingSessionUrlOutput = z.infer<typeof billingSessionUrlOutputSchema>;\n\nexport const billingCancelScheduledChangeOutputSchema = z\n .object({\n success: z.literal(true),\n })\n .strict();\nexport type BillingCancelScheduledChangeOutput = z.infer<\n typeof billingCancelScheduledChangeOutputSchema\n>;\n","import { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n billingCancelScheduledChangeOutputSchema,\n billingCreateCheckoutSessionInputSchema,\n billingCreateCustomerPortalSessionInputSchema,\n billingSessionUrlOutputSchema,\n billingStatusSchema,\n} from \"#/schemas/billing\";\n\nconst billingProcedure = oc.errors(\n pickPublicErrorMap(\n \"BILLING_NOT_CONFIGURED\",\n \"BILLING_CUSTOMER_NOT_FOUND\",\n \"BILLING_PASS_ACTIVE\",\n \"BILLING_CHANGE_SCHEDULED\",\n ),\n);\n\nexport const billingContract = {\n status: billingProcedure\n .route({\n method: \"GET\",\n path: \"/billing/status\",\n summary: \"Get authenticated user's billing status\",\n tags: [\"Billing\"],\n })\n .output(billingStatusSchema),\n createCheckoutSession: billingProcedure\n .route({\n method: \"POST\",\n path: \"/billing/checkout-sessions\",\n summary: \"Create a localized Stripe Checkout Session for a subscription\",\n tags: [\"Billing\"],\n })\n .input(billingCreateCheckoutSessionInputSchema)\n .output(billingSessionUrlOutputSchema),\n createCustomerPortalSession: billingProcedure\n .route({\n method: \"POST\",\n path: \"/billing/customer-portal-sessions\",\n summary: \"Create a Stripe Customer Portal Session\",\n tags: [\"Billing\"],\n })\n .input(billingCreateCustomerPortalSessionInputSchema)\n .output(billingSessionUrlOutputSchema),\n cancelScheduledChange: billingProcedure\n .route({\n method: \"POST\",\n path: \"/billing/scheduled-change/cancel\",\n summary: \"Cancel a scheduled subscription change\",\n tags: [\"Billing\"],\n })\n .output(billingCancelScheduledChangeOutputSchema),\n};\n","import type { Route } from \"@orpc/contract\";\nimport { oc } from \"@orpc/contract\";\n\n/**\n * A documented business route shared by OpenAPI and agent-facing adapters.\n * Both prose fields are required so adapters can reuse them without a second\n * copy or an undefined fallback.\n */\nexport type AgentRoute = Route & { summary: string; description: string };\n\n/**\n * Declares a procedure that is exposed to agents as an MCP tool, not only to\n * the REST/OpenAPI surface.\n *\n * oRPC types `~orpc.route` as the widened `Route`, so `route.summary` reads back\n * as `string | undefined` whatever is passed in. `$meta` is the only channel it\n * keeps generic, so the prose is mirrored there and stays a required `string`\n * for tool definitions. OpenAPI keeps reading `route`.\n */\nexport function defineAgentProcedure(route: AgentRoute) {\n return oc.$meta({ summary: route.summary, description: route.description }).route(route);\n}\n","import { z } from \"zod\";\nexport const paginationShape = {\n // Existing callers omit pagination to read all matching records.\n limit: z.number().int().min(1).max(500).optional(),\n offset: z.number().int().min(0).optional(),\n};\nexport function pageSchema<T extends z.ZodType>(itemSchema: T) {\n return z.object({ items: z.array(itemSchema), hasMore: z.boolean() });\n}\n","import { z } from \"zod\";\nexport const expectedUpdatedAtSchema = z.iso.datetime({ offset: true });\nexport const deletionResultSchema = z.object({\n id: z.uuid(),\n txid: z.number(),\n});\n","import { paginationShape, pageSchema } from \"./pagination\";\nimport { deletionResultSchema, expectedUpdatedAtSchema } from \"./resource-mutation\";\nimport {\n cardIdentityShape,\n cardMemoryStateShape,\n cardStateSchema,\n cardTemplateConfigSchema,\n cardTemplateCreatedBySchema,\n scheduleStatusSchema,\n} from \"@read-frog/definitions\";\nimport { z } from \"zod\";\n\nexport { cardStateSchema, scheduleStatusSchema };\nexport type { CardState, ScheduleStatus } from \"@read-frog/definitions\";\n\nexport const cardTemplateSchema = z.object({\n id: z.uuid(),\n notebaseId: z.uuid(),\n name: z.string(),\n config: cardTemplateConfigSchema,\n createdBy: cardTemplateCreatedBySchema.describe(\n 'Who made the template: \"user\", or \"system\" for the default template Read Frog gives a notebase whose fields fit one.',\n ),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\nexport type CardTemplate = z.infer<typeof cardTemplateSchema>;\n\nexport const CardTemplateListInputSchema = z.object({\n ...paginationShape,\n notebaseId: z.uuid().optional(),\n});\nexport type CardTemplateListInput = z.infer<typeof CardTemplateListInputSchema>;\n\nexport const CardTemplateListOutputSchema = pageSchema(cardTemplateSchema);\nexport type CardTemplateListOutput = z.infer<typeof CardTemplateListOutputSchema>;\n\nexport const CardTemplateGetInputSchema = z.object({\n id: z.uuid(),\n});\nexport type CardTemplateGetInput = z.infer<typeof CardTemplateGetInputSchema>;\n\nexport const CardTemplateGetOutputSchema = cardTemplateSchema;\nexport type CardTemplateGetOutput = z.infer<typeof CardTemplateGetOutputSchema>;\n\nexport const CardTemplateCreateInputSchema = z\n .object({\n id: z.uuid().optional(),\n notebaseId: z.uuid(),\n name: z.string().min(1),\n config: cardTemplateConfigSchema,\n })\n .strict();\nexport type CardTemplateCreateInput = z.infer<typeof CardTemplateCreateInputSchema>;\n\nexport const CardTemplateCreateOutputSchema = cardTemplateSchema.extend({\n txid: z.number(),\n});\nexport type CardTemplateCreateOutput = z.infer<typeof CardTemplateCreateOutputSchema>;\n\nexport const CardTemplateUpdateInputSchema = z\n .object({\n expectedUpdatedAt: expectedUpdatedAtSchema.optional(),\n id: z.uuid(),\n name: z.string().min(1).optional(),\n config: cardTemplateConfigSchema.optional(),\n })\n .strict();\nexport type CardTemplateUpdateInput = z.infer<typeof CardTemplateUpdateInputSchema>;\n\nexport const CardTemplateUpdateOutputSchema = cardTemplateSchema.extend({\n txid: z.number(),\n});\nexport type CardTemplateUpdateOutput = z.infer<typeof CardTemplateUpdateOutputSchema>;\n\nexport const CardTemplateDeleteInputSchema = z.object({\n id: z.uuid(),\n});\nexport type CardTemplateDeleteInput = z.infer<typeof CardTemplateDeleteInputSchema>;\n\nexport const CardTemplateDeleteOutputSchema = deletionResultSchema;\nexport type CardTemplateDeleteOutput = z.infer<typeof CardTemplateDeleteOutputSchema>;\n\nexport const cardSchema = z.object({\n ...cardIdentityShape,\n ...cardMemoryStateShape,\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\nexport type Card = z.infer<typeof cardSchema>;\n\nexport const renderedCardSchema = cardSchema.extend({\n front: z.string(),\n back: z.string(),\n});\nexport type RenderedCard = z.infer<typeof renderedCardSchema>;\n\nexport const CardListInputSchema = z.object({\n notebaseId: z.uuid().optional(),\n templateId: z.uuid().optional(),\n scheduleStatus: scheduleStatusSchema.optional(),\n ...paginationShape,\n});\nexport type CardListInput = z.infer<typeof CardListInputSchema>;\n\nexport const CardListOutputSchema = pageSchema(renderedCardSchema);\nexport type CardListOutput = z.infer<typeof CardListOutputSchema>;\n\nexport const CardGetInputSchema = z.object({\n id: z.uuid(),\n});\nexport type CardGetInput = z.infer<typeof CardGetInputSchema>;\n\nexport const CardGetOutputSchema = renderedCardSchema;\nexport type CardGetOutput = z.infer<typeof CardGetOutputSchema>;\n\nexport const CardGenerateInputSchema = z.object({\n notebaseId: z.uuid(),\n templateId: z.uuid().optional(),\n});\nexport type CardGenerateInput = z.infer<typeof CardGenerateInputSchema>;\n\nexport const CardGenerateOutputSchema = z.object({\n created: z.number().int().min(0),\n txid: z.number(),\n});\nexport type CardGenerateOutput = z.infer<typeof CardGenerateOutputSchema>;\n","import { defineAgentProcedure } from \"./shared\";\nimport { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n CardGenerateInputSchema,\n CardGenerateOutputSchema,\n CardGetInputSchema,\n CardGetOutputSchema,\n CardListInputSchema,\n CardListOutputSchema,\n} from \"#/schemas/card\";\n\nexport const cardContract = {\n list: defineAgentProcedure({\n method: \"GET\",\n path: \"/cards\",\n summary: \"List cards\",\n description:\n \"Browse owned cards with rendered fronts, backs, source IDs and learning state. Optionally filter by notebase, template or scheduleStatus. Supports limit and offset pagination.\",\n tags: [\"Cards\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(CardListInputSchema)\n .output(CardListOutputSchema),\n\n get: defineAgentProcedure({\n method: \"GET\",\n path: \"/cards/{id}\",\n summary: \"Get card\",\n description:\n \"Read one owned card with its rendered front, back, source IDs and learning state.\",\n tags: [\"Cards\"],\n })\n .errors(pickPublicErrorMap(\"CARD_NOT_FOUND\"))\n .input(CardGetInputSchema)\n .output(CardGetOutputSchema),\n\n generate: oc\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\", \"CARD_TEMPLATE_NOT_FOUND\"))\n .route({\n method: \"POST\",\n path: \"/cards/generate\",\n summary: \"Generate missing cards\",\n tags: [\"Cards\"],\n })\n .input(CardGenerateInputSchema)\n .output(CardGenerateOutputSchema),\n};\n","import { defineAgentProcedure } from \"./shared\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n CardTemplateCreateInputSchema,\n CardTemplateCreateOutputSchema,\n CardTemplateDeleteInputSchema,\n CardTemplateDeleteOutputSchema,\n CardTemplateGetInputSchema,\n CardTemplateGetOutputSchema,\n CardTemplateListInputSchema,\n CardTemplateListOutputSchema,\n CardTemplateUpdateInputSchema,\n CardTemplateUpdateOutputSchema,\n} from \"#/schemas/card\";\n\nexport const cardTemplateContract = {\n list: defineAgentProcedure({\n method: \"GET\",\n path: \"/card-templates\",\n summary: \"List card templates\",\n description:\n \"List owned card templates, optionally filtered by notebase. Supports limit and offset pagination.\",\n tags: [\"Card Templates\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(CardTemplateListInputSchema)\n .output(CardTemplateListOutputSchema),\n\n get: defineAgentProcedure({\n method: \"GET\",\n path: \"/card-templates/{id}\",\n summary: \"Get card template\",\n description: \"Read the complete definition and updatedAt timestamp of an owned card template.\",\n tags: [\"Card Templates\"],\n })\n .errors(pickPublicErrorMap(\"CARD_TEMPLATE_NOT_FOUND\"))\n .input(CardTemplateGetInputSchema)\n .output(CardTemplateGetOutputSchema),\n\n create: defineAgentProcedure({\n method: \"POST\",\n path: \"/card-templates\",\n summary: \"Create card template\",\n description:\n 'Create a template in an owned notebase; it generates a card for every existing note. Each face (front, back) is either { columns: [column IDs], style }, those columns in a built-in style that stays editable in the website\\'s simple mode, or { layout: \"<HTML + Liquid>\" } for a custom design that references a column as {{ [\"<column id>\"] }}. Prefer columns faces. Get column IDs from the notebase schema.',\n tags: [\"Card Templates\"],\n })\n .errors(\n pickPublicErrorMap(\n \"NOTEBASE_NOT_FOUND\",\n \"CARD_TEMPLATE_INVALID_NOTEBASE_COLUMNS\",\n \"CARD_TEMPLATE_INVALID_LAYOUT\",\n ),\n )\n .errors(pickPublicErrorMap(\"RESOURCE_ALREADY_EXISTS\"))\n .input(CardTemplateCreateInputSchema)\n .output(CardTemplateCreateOutputSchema),\n\n update: defineAgentProcedure({\n method: \"PATCH\",\n path: \"/card-templates/{id}\",\n summary: \"Update card template\",\n description:\n \"Change an owned template name or faces (see creating a template for the face shapes). Rendered cards reflect the saved template. expectedUpdatedAt guards against editing stale data.\",\n tags: [\"Card Templates\"],\n })\n .errors(\n pickPublicErrorMap(\n \"CARD_TEMPLATE_NOT_FOUND\",\n \"CARD_TEMPLATE_INVALID_NOTEBASE_COLUMNS\",\n \"CARD_TEMPLATE_INVALID_LAYOUT\",\n ),\n )\n .errors(pickPublicErrorMap(\"RESOURCE_UPDATE_CONFLICT\"))\n .input(CardTemplateUpdateInputSchema)\n .output(CardTemplateUpdateOutputSchema),\n\n delete: defineAgentProcedure({\n method: \"DELETE\",\n path: \"/card-templates/{id}\",\n summary: \"Delete card template\",\n description:\n \"Permanently delete an owned template and its generated cards and review records. Source notes are preserved.\",\n tags: [\"Card Templates\"],\n })\n .errors(pickPublicErrorMap(\"CARD_TEMPLATE_NOT_FOUND\"))\n .input(CardTemplateDeleteInputSchema)\n .output(CardTemplateDeleteOutputSchema),\n};\n","import { EBOOK_ALLOWED_COVER_CONTENT_TYPES } from \"@read-frog/definitions\";\nimport { z } from \"zod\";\n\nexport const ebookStatusSchema = z.enum([\"pending\", \"ready\"]);\nexport type EbookStatus = z.infer<typeof ebookStatusSchema>;\n\nexport const ebookCoverContentTypeSchema = z.enum(EBOOK_ALLOWED_COVER_CONTENT_TYPES);\nexport type EbookCoverContentType = z.infer<typeof ebookCoverContentTypeSchema>;\n\nexport const ebookListItemSchema = z\n .object({\n id: z.uuid(),\n title: z.string(),\n author: z.string().nullable(),\n language: z.string().nullable(),\n fileByteSize: z.number().int(),\n status: ebookStatusSchema,\n progressFraction: z.number(),\n lastReadAt: z.coerce.date().nullable(),\n coverUrl: z.url().nullable(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n })\n .strict();\nexport type EbookListItem = z.infer<typeof ebookListItemSchema>;\n\nexport const ebookDetailSchema = ebookListItemSchema.extend({\n progressCfi: z.string().nullable(),\n});\nexport type EbookDetail = z.infer<typeof ebookDetailSchema>;\n\nexport const ebookQuotaSchema = z\n .object({\n count: z.number().int().min(0),\n // 0 is a valid limit: uploading is a paid feature, so free plans get no quota.\n limit: z.number().int().min(0),\n })\n .strict();\nexport type EbookQuota = z.infer<typeof ebookQuotaSchema>;\n\nexport const ebookListInputSchema = z.object({}).strict();\nexport type EbookListInput = z.infer<typeof ebookListInputSchema>;\n\nexport const ebookListOutputSchema = z\n .object({\n items: z.array(ebookListItemSchema),\n quota: ebookQuotaSchema,\n })\n .strict();\nexport type EbookListOutput = z.infer<typeof ebookListOutputSchema>;\n\nexport const ebookGetInputSchema = z\n .object({\n id: z.uuid(),\n })\n .strict();\nexport type EbookGetInput = z.infer<typeof ebookGetInputSchema>;\n\nexport const ebookGetOutputSchema = z\n .object({\n ebook: ebookDetailSchema,\n })\n .strict();\nexport type EbookGetOutput = z.infer<typeof ebookGetOutputSchema>;\n\nexport const ebookRequestUploadInputSchema = z\n .object({\n title: z.string().min(1).max(500),\n author: z.string().max(500).optional(),\n language: z.string().max(35).optional(),\n // Exact sizes: each upload is signed for them, and storage refuses any other file.\n fileByteSize: z.number().int().min(1),\n cover: z\n .object({\n contentType: ebookCoverContentTypeSchema,\n byteSize: z.number().int().min(1),\n })\n .strict()\n .optional(),\n })\n .strict();\nexport type EbookRequestUploadInput = z.infer<typeof ebookRequestUploadInputSchema>;\n\n/**\n * A signed PUT: send the file to `url` with exactly `headers`. The signature\n * covers the file's type and exact size, so storage refuses any other file.\n */\nexport const ebookPresignedUploadSchema = z\n .object({\n url: z.url(),\n headers: z.record(z.string(), z.string()),\n })\n .strict();\nexport type EbookPresignedUpload = z.infer<typeof ebookPresignedUploadSchema>;\n\nexport const ebookRequestUploadOutputSchema = z\n .object({\n ebookId: z.uuid(),\n upload: ebookPresignedUploadSchema,\n coverUpload: ebookPresignedUploadSchema.nullable(),\n expiresAt: z.coerce.date(),\n })\n .strict();\nexport type EbookRequestUploadOutput = z.infer<typeof ebookRequestUploadOutputSchema>;\n\nexport const ebookFinalizeUploadInputSchema = z\n .object({\n ebookId: z.uuid(),\n })\n .strict();\nexport type EbookFinalizeUploadInput = z.infer<typeof ebookFinalizeUploadInputSchema>;\n\nexport const ebookFinalizeUploadOutputSchema = z\n .object({\n ebook: ebookListItemSchema,\n })\n .strict();\nexport type EbookFinalizeUploadOutput = z.infer<typeof ebookFinalizeUploadOutputSchema>;\n\nexport const ebookGetDownloadUrlInputSchema = z\n .object({\n id: z.uuid(),\n })\n .strict();\nexport type EbookGetDownloadUrlInput = z.infer<typeof ebookGetDownloadUrlInputSchema>;\n\nexport const ebookGetDownloadUrlOutputSchema = z\n .object({\n url: z.url(),\n expiresAt: z.coerce.date(),\n })\n .strict();\nexport type EbookGetDownloadUrlOutput = z.infer<typeof ebookGetDownloadUrlOutputSchema>;\n\nexport const ebookUpdateProgressDataSchema = z\n .object({\n cfi: z.string().max(2000),\n fraction: z.number().min(0).max(1),\n })\n .strict();\nexport type EbookUpdateProgressData = z.infer<typeof ebookUpdateProgressDataSchema>;\n\nexport const ebookUpdateProgressInputSchema = ebookUpdateProgressDataSchema.extend({\n id: z.uuid(),\n});\nexport type EbookUpdateProgressInput = z.infer<typeof ebookUpdateProgressInputSchema>;\n\nexport const ebookUpdateProgressOutputSchema = z\n .object({\n lastReadAt: z.coerce.date(),\n })\n .strict();\nexport type EbookUpdateProgressOutput = z.infer<typeof ebookUpdateProgressOutputSchema>;\n\nexport const ebookRenameDataSchema = z\n .object({\n title: z.string().min(1).max(500),\n author: z.string().max(500).nullable().optional(),\n })\n .strict();\nexport type EbookRenameData = z.infer<typeof ebookRenameDataSchema>;\n\nexport const ebookRenameInputSchema = ebookRenameDataSchema.extend({\n id: z.uuid(),\n});\nexport type EbookRenameInput = z.infer<typeof ebookRenameInputSchema>;\n\nexport const ebookRenameOutputSchema = z\n .object({\n ebook: ebookListItemSchema,\n })\n .strict();\nexport type EbookRenameOutput = z.infer<typeof ebookRenameOutputSchema>;\n\nexport const ebookDeleteInputSchema = z\n .object({\n id: z.uuid(),\n })\n .strict();\nexport type EbookDeleteInput = z.infer<typeof ebookDeleteInputSchema>;\n\nexport const ebookDeleteOutputSchema = z\n .object({\n id: z.uuid(),\n })\n .strict();\nexport type EbookDeleteOutput = z.infer<typeof ebookDeleteOutputSchema>;\n","import { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n ebookDeleteInputSchema,\n ebookDeleteOutputSchema,\n ebookFinalizeUploadInputSchema,\n ebookFinalizeUploadOutputSchema,\n ebookGetDownloadUrlInputSchema,\n ebookGetDownloadUrlOutputSchema,\n ebookGetInputSchema,\n ebookGetOutputSchema,\n ebookListInputSchema,\n ebookListOutputSchema,\n ebookRenameInputSchema,\n ebookRenameOutputSchema,\n ebookRequestUploadInputSchema,\n ebookRequestUploadOutputSchema,\n ebookUpdateProgressInputSchema,\n ebookUpdateProgressOutputSchema,\n} from \"#/schemas/ebook\";\n\nconst ebookProcedure = oc;\n\nexport const ebookContract = {\n list: ebookProcedure\n .errors(pickPublicErrorMap(\"EBOOK_BETA_RESTRICTED\"))\n .route({\n method: \"GET\",\n path: \"/ebooks\",\n summary: \"List ebooks with quota\",\n tags: [\"Ebooks\"],\n })\n .input(ebookListInputSchema)\n .output(ebookListOutputSchema),\n\n get: ebookProcedure\n .errors(pickPublicErrorMap(\"EBOOK_BETA_RESTRICTED\", \"EBOOK_NOT_FOUND\"))\n .route({\n method: \"GET\",\n path: \"/ebooks/{id}\",\n summary: \"Get an ebook with reading progress\",\n tags: [\"Ebooks\"],\n })\n .input(ebookGetInputSchema)\n .output(ebookGetOutputSchema),\n\n requestUpload: ebookProcedure\n .errors(\n pickPublicErrorMap(\"EBOOK_BETA_RESTRICTED\", \"EBOOK_LIMIT_EXCEEDED\", \"EBOOK_FILE_TOO_LARGE\"),\n )\n .route({\n method: \"POST\",\n path: \"/ebooks/uploads\",\n summary: \"Request presigned upload URLs for a new ebook\",\n tags: [\"Ebooks\"],\n })\n .input(ebookRequestUploadInputSchema)\n .output(ebookRequestUploadOutputSchema),\n\n finalizeUpload: ebookProcedure\n .errors(\n pickPublicErrorMap(\n \"EBOOK_BETA_RESTRICTED\",\n \"EBOOK_NOT_FOUND\",\n \"EBOOK_UPLOAD_NOT_COMPLETED\",\n \"EBOOK_FILE_TOO_LARGE\",\n ),\n )\n .route({\n method: \"POST\",\n path: \"/ebooks/{ebookId}/finalize\",\n summary: \"Finalize an ebook upload\",\n tags: [\"Ebooks\"],\n })\n .input(ebookFinalizeUploadInputSchema)\n .output(ebookFinalizeUploadOutputSchema),\n\n getDownloadUrl: ebookProcedure\n .errors(pickPublicErrorMap(\"EBOOK_BETA_RESTRICTED\", \"EBOOK_NOT_FOUND\"))\n .route({\n method: \"GET\",\n path: \"/ebooks/{id}/download-url\",\n summary: \"Get a presigned download URL for an ebook\",\n tags: [\"Ebooks\"],\n })\n .input(ebookGetDownloadUrlInputSchema)\n .output(ebookGetDownloadUrlOutputSchema),\n\n updateProgress: ebookProcedure\n .errors(pickPublicErrorMap(\"EBOOK_BETA_RESTRICTED\", \"EBOOK_NOT_FOUND\"))\n .route({\n method: \"PATCH\",\n path: \"/ebooks/{id}/progress\",\n summary: \"Update ebook reading progress\",\n tags: [\"Ebooks\"],\n })\n .input(ebookUpdateProgressInputSchema)\n .output(ebookUpdateProgressOutputSchema),\n\n rename: ebookProcedure\n .errors(pickPublicErrorMap(\"EBOOK_BETA_RESTRICTED\", \"EBOOK_NOT_FOUND\"))\n .route({\n method: \"PATCH\",\n path: \"/ebooks/{id}\",\n summary: \"Rename an ebook\",\n tags: [\"Ebooks\"],\n })\n .input(ebookRenameInputSchema)\n .output(ebookRenameOutputSchema),\n\n delete: ebookProcedure\n .errors(pickPublicErrorMap(\"EBOOK_BETA_RESTRICTED\", \"EBOOK_NOT_FOUND\"))\n .route({\n method: \"DELETE\",\n path: \"/ebooks/{id}\",\n summary: \"Delete an ebook\",\n tags: [\"Ebooks\"],\n })\n .input(ebookDeleteInputSchema)\n .output(ebookDeleteOutputSchema),\n};\n","import { z } from \"zod\";\nimport { appLocaleSchema } from \"./app-locale\";\n\n// Which marketing and lifecycle emails a user gets, by category. Read and\n// changed signed in (the settings page), or through the signed token in an\n// email's unsubscribe link (the unsubscribe page that link opens, which needs\n// no sign-in). Category names come from the server in the requested locale.\n\n/** A category's key, such as `promotions`. */\nexport const emailCategoryKeySchema = z\n .string()\n .max(64)\n .regex(/^[a-z][a-z0-9_]*$/);\nexport type EmailCategoryKey = z.infer<typeof emailCategoryKeySchema>;\n\n/** The token in an email's unsubscribe link. */\nexport const emailLinkTokenSchema = z.string().min(1).max(1024);\n\nexport const emailCategoryStateSchema = z\n .object({\n key: z.string(),\n // In the requested locale, or English when the category has none for it.\n name: z.string(),\n description: z.string().nullable(),\n // Promotional mail.\n commercial: z.boolean(),\n // Notices about the account and the service, which nobody can unsubscribe\n // from: always subscribed, \"unsubscribe from all\" included, and a change\n // to it is ignored. Show it on, without a way to turn it off.\n required: z.boolean(),\n // Whether the user gets this category now, \"unsubscribe from all\" included.\n subscribed: z.boolean(),\n })\n .strict();\nexport type EmailCategoryState = z.infer<typeof emailCategoryStateSchema>;\n\nexport const emailPreferencesStateSchema = z\n .object({\n // In display order; archived categories are left out.\n categories: z.array(emailCategoryStateSchema),\n unsubscribedAll: z.boolean(),\n })\n .strict();\nexport type EmailPreferencesState = z.infer<typeof emailPreferencesStateSchema>;\n\n/**\n * What the page a link opens shows on top of the state: whose preferences they\n * are, without the full address, and the category the link was for, if any.\n */\nexport const emailPreferencesByTokenStateSchema = z\n .object({\n ...emailPreferencesStateSchema.shape,\n maskedEmail: z.string(),\n // The link's category, when it is one the user can unsubscribe from: null\n // for a link without one, or for an archived, required or unknown one.\n highlightCategory: z.string().nullable(),\n })\n .strict();\nexport type EmailPreferencesByTokenState = z.infer<typeof emailPreferencesByTokenStateSchema>;\n\nconst emailPreferencesChangesShape = {\n // Subscribes (true) or unsubscribes (false) the categories it names, and\n // leaves the rest alone. Subscribing to one after \"unsubscribe from all\"\n // ends it, and every other category stays unsubscribed. A required category\n // is ignored.\n categories: z.record(emailCategoryKeySchema, z.boolean()).optional(),\n // true unsubscribes from every category but the required ones, including\n // categories added later; false ends that and leaves each category as it was\n // before.\n unsubscribedAll: z.boolean().optional(),\n};\n\nexport const emailPreferencesGetInputSchema = z\n .object({\n locale: appLocaleSchema,\n })\n .strict();\nexport type EmailPreferencesGetInput = z.infer<typeof emailPreferencesGetInputSchema>;\n\nexport const emailPreferencesUpdateInputSchema = z\n .object({\n locale: appLocaleSchema,\n ...emailPreferencesChangesShape,\n })\n .strict();\nexport type EmailPreferencesUpdateInput = z.infer<typeof emailPreferencesUpdateInputSchema>;\n\nexport const emailPreferencesGetByTokenInputSchema = z\n .object({\n token: emailLinkTokenSchema,\n locale: appLocaleSchema,\n })\n .strict();\nexport type EmailPreferencesGetByTokenInput = z.infer<typeof emailPreferencesGetByTokenInputSchema>;\n\nexport const emailPreferencesUpdateByTokenInputSchema = z\n .object({\n token: emailLinkTokenSchema,\n locale: appLocaleSchema,\n ...emailPreferencesChangesShape,\n })\n .strict();\nexport type EmailPreferencesUpdateByTokenInput = z.infer<\n typeof emailPreferencesUpdateByTokenInputSchema\n>;\n","import { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n emailPreferencesByTokenStateSchema,\n emailPreferencesGetByTokenInputSchema,\n emailPreferencesGetInputSchema,\n emailPreferencesStateSchema,\n emailPreferencesUpdateByTokenInputSchema,\n emailPreferencesUpdateInputSchema,\n} from \"#/schemas/email-preferences\";\n\n// Every write returns the whole state, so a client can update optimistically\n// and then take the server's answer.\nexport const emailPreferencesContract = {\n get: oc\n .route({\n method: \"GET\",\n path: \"/users/me/email-preferences\",\n summary: \"Get which emails the authenticated user receives\",\n tags: [\"Email preferences\"],\n })\n .input(emailPreferencesGetInputSchema)\n .output(emailPreferencesStateSchema),\n update: oc\n .route({\n method: \"PATCH\",\n path: \"/users/me/email-preferences\",\n summary: \"Change which emails the authenticated user receives\",\n tags: [\"Email preferences\"],\n })\n .input(emailPreferencesUpdateInputSchema)\n .output(emailPreferencesStateSchema),\n // Public: the token in an email's link stands in for signing in. POST keeps\n // the token out of URLs and logs.\n getByToken: oc\n .route({\n method: \"POST\",\n path: \"/email-preferences/by-token\",\n summary: \"Get the email preferences an email link is for\",\n tags: [\"Email preferences\"],\n })\n .errors(pickPublicErrorMap(\"EMAIL_LINK_INVALID\"))\n .input(emailPreferencesGetByTokenInputSchema)\n .output(emailPreferencesByTokenStateSchema),\n updateByToken: oc\n .route({\n method: \"POST\",\n path: \"/email-preferences/by-token/update\",\n summary: \"Change the email preferences an email link is for\",\n tags: [\"Email preferences\"],\n })\n .errors(pickPublicErrorMap(\"EMAIL_LINK_INVALID\"))\n .input(emailPreferencesUpdateByTokenInputSchema)\n .output(emailPreferencesByTokenStateSchema),\n};\n","import { GATED_FEATURE_KEYS } from \"@read-frog/definitions\";\nimport { z } from \"zod\";\n\nexport const GatedFeatureKeySchema = z.enum(GATED_FEATURE_KEYS);\nexport type GatedFeatureKey = z.infer<typeof GatedFeatureKeySchema>;\n\nexport const FeatureAccessStatusInputSchema = z\n .object({\n featureKey: GatedFeatureKeySchema,\n })\n .strict();\nexport type FeatureAccessStatusInput = z.infer<typeof FeatureAccessStatusInputSchema>;\n\nexport const FeatureAccessStatusOutputSchema = z.object({\n featureKey: GatedFeatureKeySchema,\n allowed: z.boolean(),\n});\nexport type FeatureAccessStatusOutput = z.infer<typeof FeatureAccessStatusOutputSchema>;\n","import { oc } from \"@orpc/contract\";\nimport {\n FeatureAccessStatusInputSchema,\n FeatureAccessStatusOutputSchema,\n} from \"#/schemas/feature-access\";\n\nexport const featureAccessContract = {\n status: oc\n .route({\n method: \"GET\",\n path: \"/feature-access/status\",\n summary: \"Get whether the caller can use a gated feature\",\n tags: [\"Feature Access\"],\n })\n .input(FeatureAccessStatusInputSchema)\n .output(FeatureAccessStatusOutputSchema),\n};\n","import { eventIterator, oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n HostedAiNoteSuggestionStreamInputSchema,\n HostedAiStatusInputSchema,\n HostedAiStatusOutputSchema,\n HostedAiStreamPartSchema,\n HostedAiStreamStructuredObjectInputSchema,\n HostedAiStreamTextInputSchema,\n} from \"#/schemas/hosted-ai\";\n\nconst hostedAiStreamErrors = pickPublicErrorMap(\n \"HOSTED_AI_TIER_RESTRICTED\",\n \"HOSTED_AI_QUOTA_EXHAUSTED\",\n);\n\nexport const hostedAiContract = {\n status: oc\n .route({\n method: \"GET\",\n path: \"/hosted-ai/status\",\n summary: \"Get Built-in AI availability and quota status\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStatusInputSchema)\n .output(HostedAiStatusOutputSchema),\n translate: {\n streamText: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/translate/stream-text\",\n summary: \"Stream hosted translation text output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStreamTextInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n },\n selectionTranslation: {\n streamText: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/selection-translation/stream-text\",\n summary: \"Stream hosted selection translation text output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStreamTextInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n },\n videoSubtitles: {\n // Subtitle lines and the video summary share this route: both are short\n // text and both bill against `videoSubtitles`.\n streamText: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/video-subtitles/stream-text\",\n summary: \"Stream hosted subtitle translation or video summary text output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStreamTextInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n /**\n * Segmentation shares the `videoSubtitles` feature but not its route,\n * because `endpointMaxOutputTokens` sizes the credit reservation: emitting\n * a WebVTT block needs several times a subtitle line's budget, and folding\n * both into one route would make every line reserve — and, near the end of\n * a credit window, fail to afford — what only segmentation needs.\n */\n streamSegmentation: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/video-subtitles/stream-segmentation\",\n summary: \"Stream hosted subtitle segmentation output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStreamTextInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n },\n inputTranslation: {\n streamText: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/input-translation/stream-text\",\n summary: \"Stream hosted input box translation text output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStreamTextInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n },\n languageDetection: {\n // Detection wants one short string back, not a stream, but the quota\n // reserve/settle path is stream-shaped end to end. Reusing it keeps one\n // metering implementation; the client collects the deltas.\n streamText: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/language-detection/stream-text\",\n summary: \"Stream hosted language detection output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStreamTextInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n },\n customAction: {\n streamStructuredObject: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/custom-actions/stream-structured-object\",\n summary: \"Stream hosted custom action structured output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStreamStructuredObjectInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n },\n noteSuggestion: {\n streamStructuredObject: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/note-suggestions/stream-structured-object\",\n summary: \"Stream hosted note suggestion structured output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiNoteSuggestionStreamInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n },\n};\n","import { z } from \"zod\";\n\nexport const MASTERY_GOAL_TARGET_MAX = 1_000_000;\n\n/** How many mastered cards to aim for: the cards `stats.srsMemoryGrowth` counts. */\nexport const masteryGoalTargetSchema = z.number().int().min(1).max(MASTERY_GOAL_TARGET_MAX);\nexport type MasteryGoalTarget = z.infer<typeof masteryGoalTargetSchema>;\n\n/** `null` clears the goal. */\nexport const masteryGoalUpdateInputSchema = z\n .object({\n target: masteryGoalTargetSchema.nullable(),\n })\n .strict();\nexport type MasteryGoalUpdateInput = z.infer<typeof masteryGoalUpdateInputSchema>;\n\n/** The goal's target, or `null` while none is set. */\nexport const masteryGoalOutputSchema = z\n .object({\n target: masteryGoalTargetSchema.nullable(),\n })\n .strict();\nexport type MasteryGoalOutput = z.infer<typeof masteryGoalOutputSchema>;\n","import { oc } from \"@orpc/contract\";\nimport { masteryGoalOutputSchema, masteryGoalUpdateInputSchema } from \"#/schemas/mastery-goal\";\n\nexport const masteryGoalContract = {\n get: oc\n .route({\n method: \"GET\",\n path: \"/mastery-goal\",\n summary: \"Get the authenticated user's mastered-cards goal\",\n tags: [\"Goals\"],\n })\n .output(masteryGoalOutputSchema),\n update: oc\n .route({\n method: \"PUT\",\n path: \"/mastery-goal\",\n summary: \"Set or clear the authenticated user's mastered-cards goal\",\n tags: [\"Goals\"],\n })\n .input(masteryGoalUpdateInputSchema)\n .output(masteryGoalOutputSchema),\n};\n","import { z } from \"zod\";\n\nexport const mcpConnectionSchema = z\n .object({\n /** OAuth client identifier. For a CIMD client this is an https URL. */\n clientId: z.string(),\n /** The client's registered display name, absent when it never gave one. */\n clientName: z.string().nullable(),\n scopes: z.array(z.string()),\n requestedUserInfoClaims: z.array(z.string()),\n grantedAt: z.date().nullable(),\n updatedAt: z.date().nullable(),\n /**\n * When this client last obtained an access token — the closest honest\n * proxy for \"last used\" the OAuth tables record. A token is issued on\n * connect and on every refresh, so an idle client's value stops advancing.\n */\n lastAuthorizedAt: z.date().nullable(),\n })\n .strict();\nexport type McpConnection = z.infer<typeof mcpConnectionSchema>;\n\nexport const mcpConnectionListOutputSchema = z.array(mcpConnectionSchema);\n\nexport const mcpConnectionRevokeInputSchema = z.object({ clientId: z.string().min(1) }).strict();\nexport type McpConnectionRevokeInput = z.infer<typeof mcpConnectionRevokeInputSchema>;\n\nexport const mcpConnectionRevokeOutputSchema = z.object({ clientId: z.string() }).strict();\n","import { oc } from \"@orpc/contract\";\nimport {\n mcpConnectionListOutputSchema,\n mcpConnectionRevokeInputSchema,\n mcpConnectionRevokeOutputSchema,\n} from \"#/schemas/mcp-connection\";\n\nexport const mcpConnectionContract = {\n list: oc\n .route({\n method: \"GET\",\n path: \"/mcp-connections\",\n summary: \"List the OAuth clients the caller has authorized\",\n tags: [\"MCP Connections\"],\n })\n .output(mcpConnectionListOutputSchema),\n revoke: oc\n .route({\n method: \"POST\",\n path: \"/mcp-connections/revoke\",\n summary: \"Withdraw a client's authorization and revoke its tokens\",\n tags: [\"MCP Connections\"],\n })\n .input(mcpConnectionRevokeInputSchema)\n .output(mcpConnectionRevokeOutputSchema),\n};\n","import { deletionResultSchema, expectedUpdatedAtSchema } from \"./resource-mutation\";\nimport {\n NOTEBASE_COLUMN_MAX_WIDTH,\n NOTEBASE_COLUMN_MIN_WIDTH,\n notebaseColumnConfigSchema,\n} from \"@read-frog/definitions\";\nimport { z } from \"zod\";\n\nexport const notebaseColumnWidthSchema = z\n .number()\n .int()\n .min(NOTEBASE_COLUMN_MIN_WIDTH)\n .max(NOTEBASE_COLUMN_MAX_WIDTH);\n\nexport const notebaseColumnSchema = z.object({\n id: z.string(),\n notebaseId: z.string(),\n name: z.string(),\n config: notebaseColumnConfigSchema,\n position: z.number(),\n isPrimary: z.boolean(),\n width: z.number().nullable(),\n wrap: z.boolean(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\nexport type NotebaseColumn = z.infer<typeof notebaseColumnSchema>;\n\nexport const notebaseColumnCreateDataSchema = z\n .object({\n id: z.uuid().optional(),\n name: z.string().min(1),\n config: notebaseColumnConfigSchema,\n })\n .strict();\nexport type NotebaseColumnCreateData = z.infer<typeof notebaseColumnCreateDataSchema>;\n\nexport const notebaseColumnUpdateDataSchema = z\n .object({\n expectedUpdatedAt: expectedUpdatedAtSchema.optional(),\n name: z.string().min(1).optional(),\n config: notebaseColumnConfigSchema.optional(),\n width: notebaseColumnWidthSchema.nullable().optional(),\n wrap: z.boolean().optional(),\n })\n .strict();\nexport type NotebaseColumnUpdateData = z.infer<typeof notebaseColumnUpdateDataSchema>;\n\nexport const NotebaseColumnCreateInputSchema = z.object({\n notebaseId: z.uuid(),\n data: notebaseColumnCreateDataSchema,\n});\nexport type NotebaseColumnCreateInput = z.infer<typeof NotebaseColumnCreateInputSchema>;\n\nexport const NotebaseColumnCreateOutputSchema = z.object({\n field: notebaseColumnSchema,\n txid: z.number(),\n});\nexport type NotebaseColumnCreateOutput = z.infer<typeof NotebaseColumnCreateOutputSchema>;\n\nexport const NotebaseColumnUpdateInputSchema = z.object({\n notebaseColumnId: z.uuid(),\n data: notebaseColumnUpdateDataSchema,\n});\nexport type NotebaseColumnUpdateInput = z.infer<typeof NotebaseColumnUpdateInputSchema>;\n\nexport const NotebaseColumnUpdateOutputSchema = z.object({\n field: notebaseColumnSchema,\n txid: z.number(),\n});\nexport type NotebaseColumnUpdateOutput = z.infer<typeof NotebaseColumnUpdateOutputSchema>;\n\nexport const NotebaseColumnDeleteInputSchema = z.object({\n notebaseColumnId: z.uuid(),\n});\nexport type NotebaseColumnDeleteInput = z.infer<typeof NotebaseColumnDeleteInputSchema>;\n\nexport const NotebaseColumnDeleteOutputSchema = deletionResultSchema;\nexport type NotebaseColumnDeleteOutput = z.infer<typeof NotebaseColumnDeleteOutputSchema>;\n\nexport const NotebaseColumnReorderInputSchema = z.object({\n notebaseId: z.uuid(),\n ids: z.array(z.uuid()),\n});\nexport type NotebaseColumnReorderInput = z.infer<typeof NotebaseColumnReorderInputSchema>;\n\nexport const NotebaseColumnReorderOutputSchema = z.object({\n txid: z.number(),\n});\nexport type NotebaseColumnReorderOutput = z.infer<typeof NotebaseColumnReorderOutputSchema>;\n","import { paginationShape, pageSchema } from \"./pagination\";\nimport { deletionResultSchema, expectedUpdatedAtSchema } from \"./resource-mutation\";\nimport { z } from \"zod\";\n\nexport const notebaseRowCellsSchema = z.record(z.string(), z.unknown());\n\nexport const notebaseRowSchema = z.object({\n id: z.string(),\n notebaseId: z.string(),\n cells: notebaseRowCellsSchema,\n position: z.number(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\nexport type NotebaseRow = z.infer<typeof notebaseRowSchema>;\n\nexport const notebaseRowCreateDataSchema = z\n .object({\n id: z.uuid().optional(),\n cells: notebaseRowCellsSchema.optional(),\n })\n .strict();\nexport type NotebaseRowCreateData = z.infer<typeof notebaseRowCreateDataSchema>;\n\nexport const notebaseRowUpdateDataSchema = z\n .object({\n cells: notebaseRowCellsSchema.optional(),\n expectedUpdatedAt: expectedUpdatedAtSchema.optional(),\n })\n .strict();\nexport type NotebaseRowUpdateData = z.infer<typeof notebaseRowUpdateDataSchema>;\n\nexport const NotebaseRowCreateInputSchema = z.object({\n notebaseId: z.uuid(),\n data: notebaseRowCreateDataSchema,\n});\nexport type NotebaseRowCreateInput = z.infer<typeof NotebaseRowCreateInputSchema>;\n\nexport const NotebaseRowCreateOutputSchema = z.object({\n note: notebaseRowSchema,\n txid: z.number(),\n});\nexport type NotebaseRowCreateOutput = z.infer<typeof NotebaseRowCreateOutputSchema>;\n\nexport const NOTEBASE_ROW_CREATE_MANY_MAX_ROWS = 50;\n\nexport const NotebaseRowCreateManyInputSchema = z\n .object({\n notebaseId: z.uuid(),\n rows: z.array(notebaseRowCreateDataSchema).min(1).max(NOTEBASE_ROW_CREATE_MANY_MAX_ROWS),\n })\n .superRefine((input, ctx) => {\n const seenIds = new Set<string>();\n\n input.rows.forEach((row, index) => {\n if (row.id === undefined) {\n return;\n }\n\n if (seenIds.has(row.id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Duplicate row id \"${row.id}\".`,\n path: [\"rows\", index, \"id\"],\n });\n return;\n }\n\n seenIds.add(row.id);\n });\n });\nexport type NotebaseRowCreateManyInput = z.infer<typeof NotebaseRowCreateManyInputSchema>;\n\nexport const NotebaseRowCreateManyOutputSchema = z.object({\n items: z.array(notebaseRowSchema),\n txid: z.number(),\n});\nexport type NotebaseRowCreateManyOutput = z.infer<typeof NotebaseRowCreateManyOutputSchema>;\n\nexport const NotebaseRowUpdateInputSchema = z.object({\n notebaseRowId: z.uuid(),\n data: notebaseRowUpdateDataSchema,\n});\nexport type NotebaseRowUpdateInput = z.infer<typeof NotebaseRowUpdateInputSchema>;\n\nexport const NotebaseRowUpdateOutputSchema = z.object({\n id: z.uuid(),\n notebaseId: z.uuid(),\n cells: notebaseRowCellsSchema,\n position: z.number().int(),\n createdAt: z.date(),\n updatedAt: z.date(),\n txid: z.number(),\n});\nexport type NotebaseRowUpdateOutput = z.infer<typeof NotebaseRowUpdateOutputSchema>;\n\nexport const NOTEBASE_ROW_UPDATE_MANY_MAX_ROWS = 50;\n\nexport const NotebaseRowUpdateManyInputSchema = z\n .object({\n notebaseId: z.uuid(),\n rows: z\n .array(\n z.object({\n id: z.uuid(),\n data: notebaseRowUpdateDataSchema,\n }),\n )\n .min(1)\n .max(NOTEBASE_ROW_UPDATE_MANY_MAX_ROWS),\n })\n .superRefine((input, ctx) => {\n const seenIds = new Set<string>();\n input.rows.forEach((row, index) => {\n if (seenIds.has(row.id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Duplicate row id \"${row.id}\".`,\n path: [\"rows\", index, \"id\"],\n });\n }\n seenIds.add(row.id);\n });\n });\nexport type NotebaseRowUpdateManyInput = z.infer<typeof NotebaseRowUpdateManyInputSchema>;\n\nexport const NotebaseRowUpdateManyOutputSchema = z.object({\n items: z.array(notebaseRowSchema),\n txid: z.number(),\n});\nexport type NotebaseRowUpdateManyOutput = z.infer<typeof NotebaseRowUpdateManyOutputSchema>;\n\nexport const NotebaseRowDeleteInputSchema = z.object({\n notebaseRowId: z.uuid(),\n});\nexport type NotebaseRowDeleteInput = z.infer<typeof NotebaseRowDeleteInputSchema>;\n\nexport const NotebaseRowDeleteOutputSchema = deletionResultSchema;\nexport type NotebaseRowDeleteOutput = z.infer<typeof NotebaseRowDeleteOutputSchema>;\n\nexport const NOTEBASE_ROW_DELETE_MANY_MAX_ROWS = 50;\n\nexport const NotebaseRowDeleteManyInputSchema = z\n .object({\n ids: z.array(z.uuid()).min(1).max(NOTEBASE_ROW_DELETE_MANY_MAX_ROWS),\n })\n .superRefine((input, ctx) => {\n const seenIds = new Set<string>();\n input.ids.forEach((id, index) => {\n if (seenIds.has(id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Duplicate row id \"${id}\".`,\n path: [\"ids\", index],\n });\n }\n seenIds.add(id);\n });\n });\nexport type NotebaseRowDeleteManyInput = z.infer<typeof NotebaseRowDeleteManyInputSchema>;\n\nexport const NotebaseRowDeleteManyOutputSchema = z.object({ ids: z.array(z.uuid()) });\nexport type NotebaseRowDeleteManyOutput = z.infer<typeof NotebaseRowDeleteManyOutputSchema>;\n\nexport const NotebaseRowReorderInputSchema = z.object({\n notebaseId: z.uuid(),\n ids: z.array(z.uuid()),\n});\nexport type NotebaseRowReorderInput = z.infer<typeof NotebaseRowReorderInputSchema>;\n\nexport const NotebaseRowReorderOutputSchema = z.object({\n txid: z.number(),\n});\nexport type NotebaseRowReorderOutput = z.infer<typeof NotebaseRowReorderOutputSchema>;\n\nexport const NotebaseRowListInputSchema = z\n .object({\n notebaseId: z.uuid().optional(),\n // Two characters is already a meaningful CJK query; one matches nearly\n // every note while costing the same full scan, so the floor is a cost\n // control rather than an ergonomic preference.\n query: z.string().trim().min(2).max(200).optional(),\n ...paginationShape,\n })\n // Listing without a notebase is a plain indexed read. Searching is not: it\n // expands every candidate row's cells and cannot use an index, so it stays\n // scoped to one notebase, where `notebase_rows_notebase_id_idx` bounds the\n // candidate set. Searching everything means iterating over notebases.\n .refine((input) => input.query === undefined || input.notebaseId !== undefined, {\n error: \"notebaseId is required when query is set\",\n path: [\"notebaseId\"],\n });\nexport type NotebaseRowListInput = z.infer<typeof NotebaseRowListInputSchema>;\nexport const NotebaseRowListOutputSchema = pageSchema(notebaseRowSchema);\nexport const NotebaseRowGetInputSchema = z.object({ id: z.uuid() });\nexport const NotebaseRowGetOutputSchema = notebaseRowSchema;\n","import { z } from \"zod\";\n\nexport const notebaseViewTypeSchema = z.enum([\"table\", \"kanban\", \"gallery\"]);\nexport type NotebaseViewType = z.infer<typeof notebaseViewTypeSchema>;\n\nexport const notebaseViewConfigSchema = z\n .object({\n notebaseColumnWidths: z.record(z.string(), z.number()).optional(),\n hiddenNotebaseColumns: z.array(z.string()).optional(),\n groupByNotebaseColumnId: z.string().optional(),\n })\n .catchall(z.unknown());\nexport type NotebaseViewConfig = z.infer<typeof notebaseViewConfigSchema>;\n\nexport const notebaseViewFilterSchema = z\n .object({\n notebaseColumnId: z.string(),\n operator: z.string(),\n value: z.unknown(),\n })\n .strict();\nexport type NotebaseViewFilter = z.infer<typeof notebaseViewFilterSchema>;\n\nexport const notebaseViewFiltersSchema = z.array(notebaseViewFilterSchema);\n\nexport const notebaseViewSortSchema = z\n .object({\n notebaseColumnId: z.string(),\n direction: z.enum([\"asc\", \"desc\"]),\n })\n .strict();\nexport type NotebaseViewSort = z.infer<typeof notebaseViewSortSchema>;\n\nexport const notebaseViewSortsSchema = z.array(notebaseViewSortSchema);\n\nexport const notebaseViewCreateDataSchema = z\n .object({\n id: z.uuid().optional(),\n name: z.string().min(1),\n type: notebaseViewTypeSchema,\n config: notebaseViewConfigSchema.optional(),\n filters: notebaseViewFiltersSchema.optional(),\n sorts: notebaseViewSortsSchema.optional(),\n })\n .strict();\nexport type NotebaseViewCreateData = z.infer<typeof notebaseViewCreateDataSchema>;\n\nexport const notebaseViewUpdateDataSchema = z\n .object({\n name: z.string().min(1).optional(),\n type: notebaseViewTypeSchema.optional(),\n config: notebaseViewConfigSchema.optional(),\n filters: notebaseViewFiltersSchema.optional(),\n sorts: notebaseViewSortsSchema.optional(),\n })\n .strict();\nexport type NotebaseViewUpdateData = z.infer<typeof notebaseViewUpdateDataSchema>;\n\nexport const notebaseViewSchema = z.object({\n id: z.string(),\n notebaseId: z.string(),\n name: z.string(),\n type: notebaseViewTypeSchema,\n config: notebaseViewConfigSchema.nullable(),\n filters: z.array(z.unknown()).nullable(),\n sorts: z.array(z.unknown()).nullable(),\n position: z.number(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\nexport type NotebaseView = z.infer<typeof notebaseViewSchema>;\n","import { deletionResultSchema } from \"./resource-mutation\";\nimport {\n notebaseColumnConfigSchema,\n schedulingParamsShape,\n srsModelVersionSchema,\n srsWeightsSchema,\n} from \"@read-frog/definitions\";\nimport { z } from \"zod\";\nimport { notebaseColumnSchema } from \"./notebase-column\";\nimport { NOTEBASE_ROW_CREATE_MANY_MAX_ROWS, notebaseRowSchema } from \"./notebase-row\";\nimport { notebaseViewSchema } from \"./notebase-view\";\n\nexport const NotebaseListInputSchema = z.object({});\nexport type NotebaseListInput = z.infer<typeof NotebaseListInputSchema>;\n\nexport const notebaseSummarySchema = z.object({\n id: z.string(),\n name: z.string(),\n});\nexport type NotebaseSummary = z.infer<typeof notebaseSummarySchema>;\n\nexport const NotebaseListItemSchema = notebaseSummarySchema;\nexport type NotebaseListItem = z.infer<typeof NotebaseListItemSchema>;\n\nexport const NotebaseListOutputSchema = z.array(NotebaseListItemSchema);\nexport type NotebaseListOutput = z.infer<typeof NotebaseListOutputSchema>;\n\nexport const notebaseSchema = z.object({\n id: z.string(),\n userId: z.string(),\n name: z.string(),\n srsNewPerDay: schedulingParamsShape.newPerDay,\n srsReviewsPerDay: schedulingParamsShape.reviewsPerDay,\n srsDesiredRetention: schedulingParamsShape.desiredRetention,\n srsEnableShortTerm: schedulingParamsShape.enableShortTerm,\n srsMaximumInterval: schedulingParamsShape.maximumInterval,\n srsLearningSteps: schedulingParamsShape.learningSteps,\n srsRelearningSteps: schedulingParamsShape.relearningSteps,\n srsLeechThreshold: schedulingParamsShape.leechThreshold,\n srsEnableFuzz: schedulingParamsShape.enableFuzz,\n srsWeights: srsWeightsSchema.nullable(),\n // Selects the scheduler/curve; read-only, changed only by the FSRS-7 migration.\n srsModelVersion: srsModelVersionSchema,\n // Null = awake; set = excluded from the combined review. Written by notebase.setSleep and auto sleep.\n srsSleepingAt: z.date().nullable(),\n createdAt: z.date(),\n updatedAt: z.date(),\n});\nexport type Notebase = z.infer<typeof notebaseSchema>;\n\nconst notebaseInitialRowSchema = z\n .object({\n id: z.uuid().optional(),\n cells: z.record(z.string(), z.unknown()),\n })\n .strict();\n\nexport const notebaseCreateDataSchema = z\n .object({\n id: z.uuid().optional(),\n name: z.string().min(1),\n options: z\n .object({\n initialColumns: z\n .array(\n z\n .object({\n id: z.uuid(),\n name: z.string().min(1),\n config: notebaseColumnConfigSchema,\n })\n .strict(),\n )\n .min(1),\n initialRow: notebaseInitialRowSchema.optional(),\n initialRows: z\n .array(notebaseInitialRowSchema)\n .min(1)\n .max(NOTEBASE_ROW_CREATE_MANY_MAX_ROWS)\n .optional(),\n })\n .strict()\n .superRefine((options, ctx) => {\n if (options.initialRow && options.initialRows) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Provide either initialRow or initialRows, not both.\",\n path: [\"initialRows\"],\n });\n }\n\n if (!options.initialRows) {\n return;\n }\n\n const seenIds = new Set<string>();\n options.initialRows.forEach((row, index) => {\n if (row.id === undefined) {\n return;\n }\n\n if (seenIds.has(row.id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Duplicate row id \"${row.id}\".`,\n path: [\"initialRows\", index, \"id\"],\n });\n return;\n }\n\n seenIds.add(row.id);\n });\n })\n .optional(),\n })\n .strict();\nexport type NotebaseCreateData = z.infer<typeof notebaseCreateDataSchema>;\n\nexport const NotebaseCreateInputSchema = notebaseCreateDataSchema;\nexport type NotebaseCreateInput = z.infer<typeof NotebaseCreateInputSchema>;\n\nexport const NotebaseCreateOutputSchema = z.object({\n notebase: notebaseSchema,\n txid: z.number(),\n});\nexport type NotebaseCreateOutput = z.infer<typeof NotebaseCreateOutputSchema>;\n\nexport const notebaseUpdateDataSchema = z\n .object({\n name: z.string().min(1).optional(),\n srsNewPerDay: schedulingParamsShape.newPerDay.optional(),\n srsReviewsPerDay: schedulingParamsShape.reviewsPerDay.optional(),\n srsDesiredRetention: schedulingParamsShape.desiredRetention.optional(),\n })\n .strict();\nexport type NotebaseUpdateData = z.infer<typeof notebaseUpdateDataSchema>;\n\nexport const NotebaseUpdateInputSchema = notebaseUpdateDataSchema.extend({\n id: z.uuid(),\n});\nexport type NotebaseUpdateInput = z.infer<typeof NotebaseUpdateInputSchema>;\n\nexport const NotebaseUpdateOutputSchema = z.object({\n notebase: notebaseSchema,\n txid: z.number(),\n});\nexport type NotebaseUpdateOutput = z.infer<typeof NotebaseUpdateOutputSchema>;\n\nexport const NotebaseSetSleepInputSchema = z\n .object({\n id: z.uuid(),\n enabled: z.boolean(),\n })\n .strict();\nexport type NotebaseSetSleepInput = z.infer<typeof NotebaseSetSleepInputSchema>;\n\n// txid is null when the notebase was already in the requested state: nothing to wait for.\nexport const NotebaseSetSleepOutputSchema = z.object({\n txid: z.number().nullable(),\n});\nexport type NotebaseSetSleepOutput = z.infer<typeof NotebaseSetSleepOutputSchema>;\n\nexport const NotebaseDeleteInputSchema = z.object({\n id: z.uuid(),\n});\nexport type NotebaseDeleteInput = z.infer<typeof NotebaseDeleteInputSchema>;\n\nexport const NotebaseDeleteOutputSchema = deletionResultSchema;\nexport type NotebaseDeleteOutput = z.infer<typeof NotebaseDeleteOutputSchema>;\n\n// Get endpoint schemas\nexport const NotebaseGetInputSchema = z.object({\n id: z.uuid(),\n});\nexport type NotebaseGetInput = z.infer<typeof NotebaseGetInputSchema>;\n\nexport const NotebaseGetSummaryInputSchema = z.object({\n id: z.uuid(),\n});\nexport type NotebaseGetSummaryInput = z.infer<typeof NotebaseGetSummaryInputSchema>;\n\nexport const NotebaseGetSummaryOutputSchema = notebaseSummarySchema.extend({\n srsNewPerDay: schedulingParamsShape.newPerDay,\n srsReviewsPerDay: schedulingParamsShape.reviewsPerDay,\n srsDesiredRetention: schedulingParamsShape.desiredRetention,\n noteCount: z.number().int().nonnegative(),\n});\nexport type NotebaseGetSummaryOutput = z.infer<typeof NotebaseGetSummaryOutputSchema>;\n\nexport const NotebaseGetSchemaInputSchema = z.object({\n id: z.uuid(),\n});\nexport type NotebaseGetSchemaInput = z.infer<typeof NotebaseGetSchemaInputSchema>;\n\nexport const NotebaseGetOutputSchema = notebaseSchema.extend({\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n notebaseColumns: z.array(notebaseColumnSchema),\n notebaseRows: z.array(notebaseRowSchema),\n notebaseViews: z.array(notebaseViewSchema),\n});\nexport type NotebaseGetOutput = z.infer<typeof NotebaseGetOutputSchema>;\n\nexport const NotebaseGetSchemaOutputSchema = z.object({\n id: z.string(),\n name: z.string(),\n updatedAt: z.coerce.date(),\n notebaseColumns: z.array(notebaseColumnSchema),\n});\nexport type NotebaseGetSchemaOutput = z.infer<typeof NotebaseGetSchemaOutputSchema>;\n","import { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n NotebaseCreateInputSchema,\n NotebaseCreateOutputSchema,\n NotebaseDeleteInputSchema,\n NotebaseDeleteOutputSchema,\n NotebaseGetInputSchema,\n NotebaseGetOutputSchema,\n NotebaseGetSchemaInputSchema,\n NotebaseGetSchemaOutputSchema,\n NotebaseGetSummaryInputSchema,\n NotebaseGetSummaryOutputSchema,\n NotebaseListInputSchema,\n NotebaseListOutputSchema,\n NotebaseSetSleepInputSchema,\n NotebaseSetSleepOutputSchema,\n NotebaseUpdateInputSchema,\n NotebaseUpdateOutputSchema,\n} from \"#/schemas/notebase\";\nimport { defineAgentProcedure } from \"./shared\";\n\nexport const notebaseContract = {\n list: defineAgentProcedure({\n method: \"GET\",\n path: \"/notebases\",\n summary: \"List notebases\",\n description: \"List the notebases (word books) owned by the current user.\",\n tags: [\"Notebases\"],\n })\n .input(NotebaseListInputSchema)\n .output(NotebaseListOutputSchema),\n\n getSummary: defineAgentProcedure({\n method: \"GET\",\n path: \"/notebases/{id}/summary\",\n summary: \"Get notebase summary\",\n description:\n \"Read the name, public study settings and note count of an owned notebase without loading note content.\",\n tags: [\"Notebases\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(NotebaseGetSummaryInputSchema)\n .output(NotebaseGetSummaryOutputSchema),\n\n get: oc\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .route({\n method: \"GET\",\n path: \"/notebases/{id}\",\n summary: \"Get notebase with notebase columns, rows, and views\",\n tags: [\"Notebases\"],\n })\n .input(NotebaseGetInputSchema)\n .output(NotebaseGetOutputSchema),\n\n getSchema: defineAgentProcedure({\n method: \"GET\",\n path: \"/notebases/{id}/schema\",\n summary: \"Get notebase schema\",\n description:\n \"Read an owned notebase name and field definitions, including field IDs, types and updatedAt timestamps. Does not return note content.\",\n tags: [\"Notebases\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(NotebaseGetSchemaInputSchema)\n .output(NotebaseGetSchemaOutputSchema),\n\n create: defineAgentProcedure({\n method: \"POST\",\n path: \"/notebases\",\n summary: \"Create notebase\",\n description:\n \"Create an owned notebase with optional initial fields and notes. Client-provided entity IDs are supported; duplicate IDs produce a conflict.\",\n tags: [\"Notebases\"],\n })\n .errors(pickPublicErrorMap(\"NOTE_LIMIT_EXCEEDED\", \"CELL_VALIDATION_FAILED\"))\n .errors(pickPublicErrorMap(\"RESOURCE_ALREADY_EXISTS\"))\n .input(NotebaseCreateInputSchema)\n .output(NotebaseCreateOutputSchema),\n\n update: defineAgentProcedure({\n method: \"PUT\",\n path: \"/notebases/{id}\",\n summary: \"Update notebase\",\n description:\n \"Update the supplied name or public study settings of an owned notebase, preserving omitted properties.\",\n tags: [\"Notebases\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(NotebaseUpdateInputSchema)\n .output(NotebaseUpdateOutputSchema),\n\n setSleep: defineAgentProcedure({\n method: \"POST\",\n path: \"/notebases/{id}/sleep\",\n summary: \"Set notebase sleep\",\n description:\n \"Put an owned notebase to sleep (enabled=true) or wake it (enabled=false). A sleeping notebase is left out of the combined review; its cards, memory states and review history are unchanged and it can still be reviewed directly. A request matching the current state succeeds without a change.\",\n tags: [\"Notebases\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(NotebaseSetSleepInputSchema)\n .output(NotebaseSetSleepOutputSchema),\n\n delete: defineAgentProcedure({\n method: \"DELETE\",\n path: \"/notebases/{id}\",\n summary: \"Delete notebase\",\n description:\n \"Permanently delete an owned notebase and its fields, notes, templates, cards and review records. Return the deleted notebase ID.\",\n tags: [\"Notebases\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(NotebaseDeleteInputSchema)\n .output(NotebaseDeleteOutputSchema),\n};\n","import { defineAgentProcedure } from \"./shared\";\nimport { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n NotebaseColumnCreateInputSchema,\n NotebaseColumnCreateOutputSchema,\n NotebaseColumnDeleteInputSchema,\n NotebaseColumnDeleteOutputSchema,\n NotebaseColumnReorderInputSchema,\n NotebaseColumnReorderOutputSchema,\n NotebaseColumnUpdateInputSchema,\n NotebaseColumnUpdateOutputSchema,\n} from \"#/schemas/notebase-column\";\n\nexport const notebaseColumnContract = {\n create: defineAgentProcedure({\n method: \"POST\",\n path: \"/notebase-columns\",\n summary: \"Create notebase field\",\n description:\n \"Create a field in an owned notebase. The returned field ID is used as a key in note cells.\",\n tags: [\"Notebase Columns\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\", \"CONCURRENT_POSITION_CONFLICT\"))\n .errors(pickPublicErrorMap(\"RESOURCE_ALREADY_EXISTS\"))\n .input(NotebaseColumnCreateInputSchema)\n .output(NotebaseColumnCreateOutputSchema),\n\n update: defineAgentProcedure({\n method: \"PATCH\",\n path: \"/notebase-columns/{notebaseColumnId}\",\n summary: \"Update notebase field\",\n description:\n \"Update an owned field without changing its type. Removing select options clears affected note values. expectedUpdatedAt guards against editing stale data.\",\n tags: [\"Notebase Columns\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_COLUMN_NOT_FOUND\"))\n .errors(pickPublicErrorMap(\"RESOURCE_UPDATE_CONFLICT\", \"FIELD_TYPE_CHANGE_UNSUPPORTED\"))\n .input(NotebaseColumnUpdateInputSchema)\n .output(NotebaseColumnUpdateOutputSchema),\n\n delete: defineAgentProcedure({\n method: \"DELETE\",\n path: \"/notebase-columns/{notebaseColumnId}\",\n summary: \"Delete notebase field\",\n description:\n \"Delete an owned field and remove its values from notes. Primary fields and fields referenced by templates cannot be deleted.\",\n tags: [\"Notebase Columns\"],\n })\n .errors(\n pickPublicErrorMap(\n \"NOTEBASE_COLUMN_NOT_FOUND\",\n \"PRIMARY_NOTEBASE_COLUMN_DELETE_NOT_ALLOWED\",\n \"CARD_TEMPLATE_NOTEBASE_COLUMN_IN_USE\",\n \"CONCURRENT_POSITION_CONFLICT\",\n ),\n )\n .input(NotebaseColumnDeleteInputSchema)\n .output(NotebaseColumnDeleteOutputSchema),\n\n reorder: oc\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\", \"CONCURRENT_POSITION_CONFLICT\"))\n .route({\n method: \"POST\",\n path: \"/notebase-columns/reorder\",\n summary: \"Reorder notebase columns\",\n tags: [\"Notebase Columns\"],\n })\n .input(NotebaseColumnReorderInputSchema)\n .output(NotebaseColumnReorderOutputSchema),\n};\n","import { defineAgentProcedure } from \"./shared\";\nimport {\n NotebaseRowListInputSchema,\n NotebaseRowListOutputSchema,\n NotebaseRowGetInputSchema,\n NotebaseRowGetOutputSchema,\n} from \"#/schemas/notebase-row\";\nimport { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n NotebaseRowCreateInputSchema,\n NotebaseRowCreateManyInputSchema,\n NotebaseRowCreateManyOutputSchema,\n NotebaseRowCreateOutputSchema,\n NotebaseRowDeleteInputSchema,\n NotebaseRowDeleteManyInputSchema,\n NotebaseRowDeleteManyOutputSchema,\n NotebaseRowDeleteOutputSchema,\n NotebaseRowReorderInputSchema,\n NotebaseRowReorderOutputSchema,\n NotebaseRowUpdateInputSchema,\n NotebaseRowUpdateManyInputSchema,\n NotebaseRowUpdateManyOutputSchema,\n NotebaseRowUpdateOutputSchema,\n} from \"#/schemas/notebase-row\";\n\nexport const notebaseRowContract = {\n list: defineAgentProcedure({\n method: \"GET\",\n path: \"/notebase-rows\",\n summary: \"List or search notes\",\n description:\n \"List or search owned notes, optionally within one notebase. Supply query to search; omit it to browse, which returns every note in scope rather than a filtered set. Searching requires notebaseId and covers that one notebase, so cover several by listing them first and calling this once per notebase. The query filter is at least two characters, matches a literal case-insensitive substring, and only searches fields of type string, so values in number, boolean, date and select fields are never matched. Supports limit and offset pagination.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(NotebaseRowListInputSchema)\n .output(NotebaseRowListOutputSchema),\n get: defineAgentProcedure({\n method: \"GET\",\n path: \"/notebase-rows/{id}\",\n summary: \"Get note\",\n description:\n \"Read one owned note with field-ID values and the updatedAt timestamp used for modification checks.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_ROW_NOT_FOUND\"))\n .input(NotebaseRowGetInputSchema)\n .output(NotebaseRowGetOutputSchema),\n create: defineAgentProcedure({\n method: \"POST\",\n path: \"/notebase-rows\",\n summary: \"Create note\",\n description:\n \"Create a note in an owned notebase using field IDs and their declared value types. Existing templates generate cards. A duplicate entity ID produces a conflict.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(\n pickPublicErrorMap(\n \"NOTEBASE_NOT_FOUND\",\n \"CELL_VALIDATION_FAILED\",\n \"CONCURRENT_POSITION_CONFLICT\",\n \"NOTE_LIMIT_EXCEEDED\",\n ),\n )\n .errors(pickPublicErrorMap(\"RESOURCE_ALREADY_EXISTS\"))\n .input(NotebaseRowCreateInputSchema)\n .output(NotebaseRowCreateOutputSchema),\n\n createMany: defineAgentProcedure({\n method: \"POST\",\n path: \"/notebase-rows/batch\",\n summary: \"Create notes\",\n description:\n \"Create 1–50 notes atomically in one owned notebase. Cells use field IDs and declared value types. Existing templates generate cards. Duplicate entity IDs roll back the whole batch.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(\n pickPublicErrorMap(\n \"NOTEBASE_NOT_FOUND\",\n \"CELL_VALIDATION_FAILED\",\n \"CONCURRENT_POSITION_CONFLICT\",\n \"NOTE_LIMIT_EXCEEDED\",\n ),\n )\n .errors(pickPublicErrorMap(\"RESOURCE_ALREADY_EXISTS\"))\n .input(NotebaseRowCreateManyInputSchema)\n .output(NotebaseRowCreateManyOutputSchema),\n\n update: defineAgentProcedure({\n method: \"PATCH\",\n path: \"/notebase-rows/{notebaseRowId}\",\n summary: \"Update note\",\n description:\n \"Merge supplied fields into an owned note, preserving omitted fields. Use null to clear a field. expectedUpdatedAt guards against editing stale data; reread on a modification conflict.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_ROW_NOT_FOUND\", \"CELL_VALIDATION_FAILED\"))\n .errors(pickPublicErrorMap(\"RESOURCE_UPDATE_CONFLICT\"))\n .input(NotebaseRowUpdateInputSchema)\n .output(NotebaseRowUpdateOutputSchema),\n\n updateMany: defineAgentProcedure({\n method: \"PATCH\",\n path: \"/notebase-rows/batch\",\n summary: \"Update notes\",\n description:\n \"Update 1–50 notes atomically in one owned notebase. Each row supplies its ID and fields to merge; omitted fields are preserved and null clears a field. Supply each note's expectedUpdatedAt to guard against stale edits. A missing row, invalid field or modification conflict rolls back the whole batch. Items are returned in input order.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(\n pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\", \"NOTEBASE_ROW_NOT_FOUND\", \"CELL_VALIDATION_FAILED\"),\n )\n .errors(pickPublicErrorMap(\"RESOURCE_UPDATE_CONFLICT\"))\n .input(NotebaseRowUpdateManyInputSchema)\n .output(NotebaseRowUpdateManyOutputSchema),\n\n delete: defineAgentProcedure({\n method: \"DELETE\",\n path: \"/notebase-rows/{notebaseRowId}\",\n summary: \"Delete note\",\n description:\n \"Permanently delete an owned note and its derived cards and review records. Return the deleted note ID.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_ROW_NOT_FOUND\", \"CONCURRENT_POSITION_CONFLICT\"))\n .input(NotebaseRowDeleteInputSchema)\n .output(NotebaseRowDeleteOutputSchema),\n\n deleteMany: defineAgentProcedure({\n method: \"POST\",\n path: \"/notebase-rows/batch/delete\",\n summary: \"Delete notes\",\n description:\n \"Permanently delete 1–50 owned notes atomically, including their derived cards and review records. Notes may belong to different notebases. If any ID is missing or inaccessible, nothing is deleted. Return deleted IDs in input order.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_ROW_NOT_FOUND\", \"CONCURRENT_POSITION_CONFLICT\"))\n .input(NotebaseRowDeleteManyInputSchema)\n .output(NotebaseRowDeleteManyOutputSchema),\n\n reorder: oc\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\", \"CONCURRENT_POSITION_CONFLICT\"))\n .route({\n method: \"POST\",\n path: \"/notebase-rows/reorder\",\n summary: \"Reorder notebase rows\",\n tags: [\"Notebase Rows\"],\n })\n .input(NotebaseRowReorderInputSchema)\n .output(NotebaseRowReorderOutputSchema),\n};\n","import type { BillingPlan } from \"./billing\";\nimport { langCodeISO6393Schema } from \"@read-frog/definitions\";\nimport { z } from \"zod\";\n\n// Reading text aloud in the account's voices: the reader's settings, the\n// voices to choose from, and the request that turns a text into audio.\n\n/** The longest text one request reads aloud. */\nexport const SPEECH_TEXT_MAX_LENGTH = 500;\n\n/**\n * How many texts each plan may have read aloud in a day (24 hours from the\n * first one). Generous enough that reviewing never runs into it; the cap is\n * there to keep the voices from being used as a free speech service.\n */\nexport const SPEECH_DAILY_REQUEST_LIMITS = {\n free: 200,\n pro: 5000,\n ultra: 5000,\n} as const satisfies Record<BillingPlan, number>;\n\n/** A voice by its short name: its locale, then the voice (`en-US-AndrewMultilingualNeural`). */\nexport const speechVoiceNameSchema = z\n .string()\n .max(100)\n .regex(/^[a-z]{2,3}(?:-[A-Za-z0-9]+)+(?::[A-Za-z0-9]+)?$/);\nexport type SpeechVoiceName = z.infer<typeof speechVoiceNameSchema>;\n\nexport const SPEECH_RATE_MIN = -50;\nexport const SPEECH_RATE_MAX = 100;\n\n/** Reading speed: percent faster (+) or slower (−) than normal. */\nexport const speechRateSchema = z.number().int().min(SPEECH_RATE_MIN).max(SPEECH_RATE_MAX);\n\n/**\n * How the account reads aloud. A language left out of `languageVoices`, and a\n * `null` `multilingualVoice`, read in the default voice (`speech.listVoices`\n * names them).\n */\nexport const speechPreferencesSchema = z\n .object({\n languageVoices: z.partialRecord(langCodeISO6393Schema, speechVoiceNameSchema),\n // Reads text whose language is not known, working the language out itself.\n multilingualVoice: speechVoiceNameSchema.nullable(),\n rate: speechRateSchema,\n })\n .strict();\nexport type SpeechPreferences = z.infer<typeof speechPreferencesSchema>;\n\nexport const DEFAULT_SPEECH_PREFERENCES: SpeechPreferences = {\n languageVoices: {},\n multilingualVoice: null,\n rate: 0,\n};\n\n/**\n * Changes some settings and keeps the rest. `languageVoices` changes only the\n * languages it names; `null` puts a language back on its default voice.\n */\nexport const speechPreferencesUpdateInputSchema = z\n .object({\n languageVoices: z\n .partialRecord(langCodeISO6393Schema, speechVoiceNameSchema.nullable())\n .optional(),\n multilingualVoice: speechVoiceNameSchema.nullable().optional(),\n rate: speechRateSchema.optional(),\n })\n .strict();\nexport type SpeechPreferencesUpdateInput = z.infer<typeof speechPreferencesUpdateInputSchema>;\n\nexport const speechVoiceGenderSchema = z.enum([\"female\", \"male\", \"neutral\"]);\nexport type SpeechVoiceGender = z.infer<typeof speechVoiceGenderSchema>;\n\nexport const speechVoiceSchema = z\n .object({\n name: speechVoiceNameSchema,\n // The voice's name for people, such as \"Andrew Multilingual\".\n displayName: z.string(),\n locale: z.string(),\n // The language the voice is for; null for one this list has no code for.\n language: langCodeISO6393Schema.nullable(),\n gender: speechVoiceGenderSchema,\n // Reads many languages, working out the text's language itself.\n multilingual: z.boolean(),\n })\n .strict();\nexport type SpeechVoice = z.infer<typeof speechVoiceSchema>;\n\nexport const speechVoicesOutputSchema = z\n .object({\n voices: z.array(speechVoiceSchema),\n // The voice each language reads in until the reader picks one.\n defaultVoices: z.partialRecord(langCodeISO6393Schema, speechVoiceNameSchema),\n defaultMultilingualVoice: speechVoiceNameSchema,\n })\n .strict();\nexport type SpeechVoicesOutput = z.infer<typeof speechVoicesOutputSchema>;\n\nexport const speechSynthesizeInputSchema = z\n .object({\n text: z.string().trim().min(1).max(SPEECH_TEXT_MAX_LENGTH),\n // The text's language, when the caller knows it; without one, a\n // multilingual voice works it out.\n language: langCodeISO6393Schema.optional(),\n // Reads in this voice instead of the account's, such as one the reader is\n // trying out in the settings.\n voice: speechVoiceNameSchema.optional(),\n })\n .strict();\nexport type SpeechSynthesizeInput = z.infer<typeof speechSynthesizeInputSchema>;\n\n/**\n * Where to download the audio, an MP3: a link to fetch at once, which stops\n * working at `expiresAt`.\n */\nexport const speechSynthesizeOutputSchema = z\n .object({\n url: z.url(),\n expiresAt: z.coerce.date(),\n })\n .strict();\nexport type SpeechSynthesizeOutput = z.infer<typeof speechSynthesizeOutputSchema>;\n","import { oc } from \"@orpc/contract\";\nimport {\n speechPreferencesSchema,\n speechPreferencesUpdateInputSchema,\n speechSynthesizeInputSchema,\n speechSynthesizeOutputSchema,\n speechVoicesOutputSchema,\n} from \"#/schemas/speech\";\n\nexport const speechContract = {\n getPreferences: oc\n .route({\n method: \"GET\",\n path: \"/speech/preferences\",\n summary: \"Get how the authenticated user's text is read aloud\",\n tags: [\"Speech\"],\n })\n .output(speechPreferencesSchema),\n updatePreferences: oc\n .route({\n method: \"PATCH\",\n path: \"/speech/preferences\",\n summary: \"Change how the authenticated user's text is read aloud\",\n tags: [\"Speech\"],\n })\n .input(speechPreferencesUpdateInputSchema)\n .output(speechPreferencesSchema),\n listVoices: oc\n .route({\n method: \"GET\",\n path: \"/speech/voices\",\n summary: \"List the voices text can be read aloud in, and each language's default\",\n tags: [\"Speech\"],\n })\n .output(speechVoicesOutputSchema),\n synthesize: oc\n .route({\n method: \"POST\",\n path: \"/speech/synthesize\",\n summary: \"Read a text aloud, and link to its MP3 audio\",\n tags: [\"Speech\"],\n })\n .input(speechSynthesizeInputSchema)\n .output(speechSynthesizeOutputSchema),\n};\n","import { canonicalTimeZone } from \"@read-frog/definitions\";\nimport { z } from \"zod\";\n\n// @ref https://zenn.dev/herp_inc/articles/js-intl-date-time-format-performance\n// Keyed by the lowercased id, because Intl matches ids case-insensitively: raw\n// keys would let every casing of a zone pin its own entry for the life of the\n// process. Links (Asia/Kolkata) share their canonical zone's formatter (~30 KB\n// of ICU memory each), so the map holds one key per IANA name. Offset zones\n// (\"+08:00\") are valid but stay uncached, because there are ~2.9k of them.\nconst timezoneFormatters = new Map<string, Intl.DateTimeFormat>();\n\n// ASCII only, as Intl does: toLowerCase() would also fold look-alikes such as\n// the Kelvin sign onto \"k\", letting an id Intl rejects hit a cached zone.\nfunction toCacheKey(timezone: string) {\n return timezone.replace(/[A-Z]/g, (letter) => letter.toLowerCase());\n}\n\nfunction getTimezoneFormatter(timezone: string): Intl.DateTimeFormat {\n const key = toCacheKey(timezone);\n const cached = timezoneFormatters.get(key);\n if (cached) {\n return cached;\n }\n\n const formatter = new Intl.DateTimeFormat(\"en-US\", { timeZone: timezone });\n const canonical = formatter.resolvedOptions().timeZone;\n if (canonical.startsWith(\"+\") || canonical.startsWith(\"-\")) {\n return formatter;\n }\n\n const canonicalKey = toCacheKey(canonical);\n const shared = timezoneFormatters.get(canonicalKey) ?? formatter;\n timezoneFormatters.set(canonicalKey, shared).set(key, shared);\n return shared;\n}\n\nexport const timezoneSchema = z\n .string()\n .trim()\n .min(1)\n .refine((timezone) => {\n try {\n getTimezoneFormatter(timezone).format(new Date());\n return true;\n } catch {\n return false;\n }\n }, \"Invalid timezone\");\nexport type Timezone = z.infer<typeof timezoneSchema>;\n\n/**\n * The zone a call reckons days in, under the name an account's zone is stored\n * under (`canonicalTimeZone`): \"Asia/Calcutta\" arrives as \"Asia/Kolkata\" and\n * \"CST\" as \"America/Chicago\", names that Temporal and a Debian Postgres both\n * read. A fixed offset (\"+08:00\") is refused, as Postgres reads it with the\n * opposite sign and would put the call's days on the wrong side of UTC.\n */\nexport const canonicalTimezoneSchema = timezoneSchema.transform((timezone, ctx) => {\n const name = canonicalTimeZone(timezone);\n if (!name) {\n ctx.addIssue({\n code: \"custom\",\n message:\n \"Use an IANA time zone identifier instead of a fixed UTC offset. See https://www.iana.org/time-zones\",\n });\n return z.NEVER;\n }\n return name;\n});\n","import { paginationShape } from \"./pagination\";\nimport {\n activeScheduleStatusSchema,\n cardStateSchema,\n fsrsReviewLogSnapshotSchema,\n fsrsMemoryStateSchema,\n reviewRatingSchema,\n scheduleStatusSchema,\n schedulingParamsSchema,\n SRS_REVIEW_DURATION_MS_MAX,\n srsStepSchema,\n} from \"@read-frog/definitions\";\nimport { z } from \"zod\";\nimport { cardSchema } from \"./card\";\nimport { notebaseSummarySchema } from \"./notebase\";\nimport { canonicalTimezoneSchema } from \"./timezone\";\n\nexport { reviewRatingSchema, schedulingParamsSchema, SRS_REVIEW_DURATION_MS_MAX };\nexport { timezoneSchema } from \"./timezone\";\nexport type { Timezone } from \"./timezone\";\nexport type { ReviewRating, SchedulingParams } from \"@read-frog/definitions\";\n\nexport const stepSchema = srsStepSchema;\nexport type Step = z.infer<typeof stepSchema>;\n\nexport const SRS_REVIEW_CLIENT_ID_NAMESPACE = \"6ba7b811-9dad-11d1-80b4-00c04fd430c8\";\nconst srsReviewClientIdNamePrefix = \"readfrog:srs-review\";\nconst nullLastReviewTimeSentinel = \"null\";\n\nexport interface SrsReviewClientIdCard {\n id: string;\n lastReviewTime: Date | string | null;\n}\n\nexport async function createSrsReviewClientId(card: SrsReviewClientIdCard) {\n return uuidV5(\n `${srsReviewClientIdNamePrefix}:${card.id}:${formatLastReviewTime(card.lastReviewTime)}`,\n SRS_REVIEW_CLIENT_ID_NAMESPACE,\n );\n}\n\nexport const srsReviewInputSchema = z\n .object({\n cardId: z.uuid(),\n id: z.uuid().optional(),\n rating: reviewRatingSchema,\n durationMs: z.number().int().min(0).max(SRS_REVIEW_DURATION_MS_MAX),\n timezone: canonicalTimezoneSchema,\n })\n .strict();\nexport type SrsReviewInput = z.infer<typeof srsReviewInputSchema>;\n\nexport const srsRollbackReviewInputSchema = z\n .object({\n expectedReviewId: z.uuid().optional(),\n cardId: z.uuid(),\n })\n .strict();\nexport type SrsRollbackReviewInput = z.infer<typeof srsRollbackReviewInputSchema>;\n\nexport const srsScheduleStatusStatsSchema = z.record(\n activeScheduleStatusSchema,\n z.number().int().min(0),\n);\nexport type SrsScheduleStatusStats = z.infer<typeof srsScheduleStatusStatsSchema>;\n\nexport const srsScheduleStatusStatsInputSchema = z\n .object({\n notebaseIds: z.array(z.uuid()).optional(),\n timezone: canonicalTimezoneSchema,\n })\n .strict();\nexport type SrsScheduleStatusStatsInput = z.infer<typeof srsScheduleStatusStatsInputSchema>;\n\nexport const srsScheduleStatusStatsOutputSchema = z.record(z.uuid(), srsScheduleStatusStatsSchema);\nexport type SrsScheduleStatusStatsOutput = z.infer<typeof srsScheduleStatusStatsOutputSchema>;\n\nexport const srsRecentNotebaseScheduleStatusStatsInputSchema = z\n .object({\n timezone: canonicalTimezoneSchema,\n })\n .strict();\nexport type SrsRecentNotebaseScheduleStatusStatsInput = z.infer<\n typeof srsRecentNotebaseScheduleStatusStatsInputSchema\n>;\n\n/** Null when the user has no notebase yet. */\nexport const srsRecentNotebaseScheduleStatusStatsOutputSchema = z\n .object({\n notebase: notebaseSummarySchema,\n stats: srsScheduleStatusStatsSchema,\n })\n .nullable();\nexport type SrsRecentNotebaseScheduleStatusStatsOutput = z.infer<\n typeof srsRecentNotebaseScheduleStatusStatsOutputSchema\n>;\n\nexport const srsManualCardStatusInputSchema = z\n .object({\n cardId: z.uuid(),\n enabled: z.boolean(),\n })\n .strict();\nexport type SrsManualCardStatusInput = z.infer<typeof srsManualCardStatusInputSchema>;\n\nexport const srsSetCardBuriedInputSchema = srsManualCardStatusInputSchema;\nexport type SrsSetCardBuriedInput = SrsManualCardStatusInput;\n\nexport const srsSetCardSuspendedInputSchema = srsManualCardStatusInputSchema;\nexport type SrsSetCardSuspendedInput = SrsManualCardStatusInput;\n\nexport const srsRevlogSchema = z.object({\n id: z.uuid(),\n notebaseId: z.uuid(),\n cardId: z.uuid(),\n rating: reviewRatingSchema,\n state: cardStateSchema,\n stability: z.number(),\n afterScheduleStatus: scheduleStatusSchema,\n afterMemoryState: fsrsMemoryStateSchema,\n retentionDays90: z.number().nonnegative(),\n afterRetentionDays90: z.number().nonnegative(),\n reviewedAt: z.coerce.date(),\n durationMs: z.number().int(),\n fsrsReviewLogSnapshot: fsrsReviewLogSnapshotSchema,\n createdAt: z.coerce.date(),\n});\nexport type SrsRevlog = z.infer<typeof srsRevlogSchema>;\n\nexport const srsRevlogWithoutSnapshotSchema = srsRevlogSchema.omit({\n fsrsReviewLogSnapshot: true,\n});\nexport type SrsRevlogWithoutSnapshot = z.infer<typeof srsRevlogWithoutSnapshotSchema>;\n\nexport const srsListCardRevlogsInputSchema = z\n .object({\n ...paginationShape,\n notebaseId: z.uuid().optional(),\n cardId: z.uuid().optional(),\n })\n .strict();\nexport type SrsListCardRevlogsInput = z.infer<typeof srsListCardRevlogsInputSchema>;\n\nexport const srsListCardRevlogsOutputSchema = z\n .object({\n items: z.array(srsRevlogWithoutSnapshotSchema),\n hasMore: z.boolean(),\n })\n .strict();\nexport type SrsListCardRevlogsOutput = z.infer<typeof srsListCardRevlogsOutputSchema>;\n\nexport const srsReviewOutputSchema = z.object({\n card: cardSchema,\n revlog: srsRevlogSchema,\n txid: z.number(),\n // False when an idempotent replay returned an existing revlog instead of creating one.\n created: z.boolean(),\n});\nexport type SrsReviewOutput = z.infer<typeof srsReviewOutputSchema>;\n\nexport const srsRollbackReviewOutputSchema = z.object({\n card: cardSchema,\n rolledBackRevlogId: z.uuid(),\n txid: z.number(),\n});\nexport type SrsRollbackReviewOutput = z.infer<typeof srsRollbackReviewOutputSchema>;\n\nexport const srsTxidOutputSchema = z.object({\n txid: z.number(),\n});\nexport type SrsTxidOutput = z.infer<typeof srsTxidOutputSchema>;\n\nexport const srsSetCardBuriedOutputSchema = srsTxidOutputSchema;\nexport type SrsSetCardBuriedOutput = SrsTxidOutput;\n\nexport const srsSetCardSuspendedOutputSchema = srsTxidOutputSchema;\nexport type SrsSetCardSuspendedOutput = SrsTxidOutput;\n\nexport const srsListUnreadOptimizerResultsInputSchema = z.object({}).strict();\n\nexport const srsOptimizerUnreadResultSchema = z\n .object({\n runId: z.uuid(),\n notebaseName: z.string().min(1),\n revlogCount: z.number().int().positive(),\n improvement: z.number().nonnegative().nullable(),\n })\n .strict();\nexport type SrsOptimizerUnreadResult = z.infer<typeof srsOptimizerUnreadResultSchema>;\n\nexport const srsListUnreadOptimizerResultsOutputSchema = z.array(srsOptimizerUnreadResultSchema);\nexport type SrsListUnreadOptimizerResultsOutput = z.infer<\n typeof srsListUnreadOptimizerResultsOutputSchema\n>;\n\nexport const srsAcknowledgeOptimizerResultsInputSchema = z\n .object({\n runIds: z.array(z.uuid()).min(1),\n })\n .strict();\nexport type SrsAcknowledgeOptimizerResultsInput = z.infer<\n typeof srsAcknowledgeOptimizerResultsInputSchema\n>;\n\nexport const srsAcknowledgeOptimizerResultsOutputSchema = z\n .object({\n acknowledgedCount: z.number().int().nonnegative(),\n })\n .strict();\nexport type SrsAcknowledgeOptimizerResultsOutput = z.infer<\n typeof srsAcknowledgeOptimizerResultsOutputSchema\n>;\n\nfunction formatLastReviewTime(lastReviewTime: Date | string | null) {\n return lastReviewTime ? new Date(lastReviewTime).toISOString() : nullLastReviewTimeSentinel;\n}\n\nasync function uuidV5(name: string, namespace: string) {\n const namespaceBytes = uuidToBytes(namespace);\n const nameBytes = new TextEncoder().encode(name);\n const input = new Uint8Array(namespaceBytes.length + nameBytes.length);\n input.set(namespaceBytes);\n input.set(nameBytes, namespaceBytes.length);\n\n const hash = new Uint8Array(await crypto.subtle.digest(\"SHA-1\", input));\n const bytes = hash.slice(0, 16);\n const versionByte = bytes[6];\n const variantByte = bytes[8];\n if (versionByte === undefined || variantByte === undefined) {\n throw new Error(\"SHA-1 digest was too short\");\n }\n bytes[6] = (versionByte & 0x0f) | 0x50;\n bytes[8] = (variantByte & 0x3f) | 0x80;\n\n return bytesToUuid(bytes);\n}\n\nfunction uuidToBytes(uuid: string) {\n const hex = uuid.replaceAll(\"-\", \"\").toLowerCase();\n /* v8 ignore next 3 -- SRS_REVIEW_CLIENT_ID_NAMESPACE is a fixed valid UUID. */\n if (!/^[0-9a-f]{32}$/.test(hex)) {\n throw new Error(\"Invalid UUID namespace\");\n }\n\n return new Uint8Array(\n Array.from({ length: 16 }, (_, index) =>\n Number.parseInt(hex.slice(index * 2, index * 2 + 2), 16),\n ),\n );\n}\n\nfunction bytesToUuid(bytes: Uint8Array) {\n const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\"));\n return [\n hex.slice(0, 4).join(\"\"),\n hex.slice(4, 6).join(\"\"),\n hex.slice(6, 8).join(\"\"),\n hex.slice(8, 10).join(\"\"),\n hex.slice(10, 16).join(\"\"),\n ].join(\"-\");\n}\n","import { defineAgentProcedure } from \"./shared\";\nimport { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n srsAcknowledgeOptimizerResultsInputSchema,\n srsAcknowledgeOptimizerResultsOutputSchema,\n srsListCardRevlogsInputSchema,\n srsListCardRevlogsOutputSchema,\n srsListUnreadOptimizerResultsInputSchema,\n srsListUnreadOptimizerResultsOutputSchema,\n srsRecentNotebaseScheduleStatusStatsInputSchema,\n srsRecentNotebaseScheduleStatusStatsOutputSchema,\n srsReviewInputSchema,\n srsReviewOutputSchema,\n srsRollbackReviewInputSchema,\n srsRollbackReviewOutputSchema,\n srsScheduleStatusStatsInputSchema,\n srsScheduleStatusStatsOutputSchema,\n srsSetCardBuriedInputSchema,\n srsSetCardBuriedOutputSchema,\n srsSetCardSuspendedInputSchema,\n srsSetCardSuspendedOutputSchema,\n} from \"#/schemas/srs\";\n\nexport const srsContract = {\n scheduleStatusStats: defineAgentProcedure({\n method: \"GET\",\n path: \"/srs/schedule-status-stats\",\n summary: \"Get study statistics\",\n description:\n \"Read existing study queue counts for owned notebases in the supplied timezone. Does not return note content or card faces.\",\n tags: [\"SRS\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(srsScheduleStatusStatsInputSchema)\n .output(srsScheduleStatusStatsOutputSchema),\n recentNotebaseScheduleStatusStats: oc\n .route({\n method: \"GET\",\n path: \"/srs/schedule-status-stats/recent\",\n summary: \"Get study queue counts of the most recently used notebase\",\n description:\n \"Picks the owned notebase with the latest review or content edit (notes, fields or templates) and returns its study queue counts in the supplied timezone.\",\n tags: [\"SRS\"],\n })\n .input(srsRecentNotebaseScheduleStatusStatsInputSchema)\n .output(srsRecentNotebaseScheduleStatusStatsOutputSchema),\n listUnreadOptimizerResults: oc\n .route({\n method: \"GET\",\n path: \"/srs/optimizer-results/unread\",\n summary: \"List unread applied SRS optimizer results\",\n tags: [\"SRS\"],\n })\n .input(srsListUnreadOptimizerResultsInputSchema)\n .output(srsListUnreadOptimizerResultsOutputSchema),\n\n acknowledgeOptimizerResults: oc\n .route({\n method: \"POST\",\n path: \"/srs/optimizer-results/acknowledge\",\n summary: \"Acknowledge current SRS optimizer results\",\n tags: [\"SRS\"],\n })\n .input(srsAcknowledgeOptimizerResultsInputSchema)\n .output(srsAcknowledgeOptimizerResultsOutputSchema),\n\n listCardRevlogs: defineAgentProcedure({\n method: \"GET\",\n path: \"/srs/revlogs\",\n summary: \"List review history\",\n description:\n \"Read owned review records, optionally filtered by notebase or card. Supports limit and offset pagination. Note content, card faces and rollback snapshots are excluded.\",\n tags: [\"SRS\"],\n })\n .errors(pickPublicErrorMap(\"CARD_NOT_FOUND\", \"NOTEBASE_NOT_FOUND\"))\n .input(srsListCardRevlogsInputSchema)\n .output(srsListCardRevlogsOutputSchema),\n\n review: defineAgentProcedure({\n method: \"POST\",\n path: \"/srs/review\",\n summary: \"Record review\",\n description:\n \"Submit one rating for a known owned card without a queue, session or prerequisite read. Existing SRS eligibility, scheduling and sibling rules apply. The optional id is the existing state-derived review ID, not an arbitrary UUID; calls without a stable id are not guaranteed to deduplicate.\",\n tags: [\"SRS\"],\n })\n .errors(pickPublicErrorMap(\"CARD_NOT_FOUND\", \"CARD_NOT_REVIEWABLE\", \"CARD_REVIEW_STATE_STALE\"))\n .input(srsReviewInputSchema)\n .output(srsReviewOutputSchema),\n rollbackReview: defineAgentProcedure({\n method: \"POST\",\n path: \"/srs/review/rollback\",\n summary: \"Undo review\",\n description:\n \"Undo the latest eligible review of one owned card, preserving existing SRS restrictions and sibling restoration. expectedReviewId guards against undoing an earlier review on a retry.\",\n tags: [\"SRS\"],\n })\n .errors(\n pickPublicErrorMap(\n \"CARD_NOT_FOUND\",\n \"CARD_REVIEW_ROLLBACK_UNAVAILABLE\",\n \"CARD_REVIEW_STATE_STALE\",\n ),\n )\n .input(srsRollbackReviewInputSchema)\n .output(srsRollbackReviewOutputSchema),\n setCardBuried: defineAgentProcedure({\n method: \"POST\",\n path: \"/srs/card/bury\",\n summary: \"Set card buried\",\n description:\n \"Bury or unbury one owned card. enabled=true buries and enabled=false unburies it. Existing state-change rules apply.\",\n tags: [\"SRS\"],\n })\n .errors(\n pickPublicErrorMap(\n \"CARD_NOT_FOUND\",\n \"CARD_ALREADY_BURIED\",\n \"CARD_NOT_BURIED\",\n \"CARD_STATUS_CHANGE_UNAVAILABLE\",\n ),\n )\n .input(srsSetCardBuriedInputSchema)\n .output(srsSetCardBuriedOutputSchema),\n setCardSuspended: defineAgentProcedure({\n method: \"POST\",\n path: \"/srs/card/suspend\",\n summary: \"Set card suspended\",\n description:\n \"Suspend or resume one owned card. enabled=true suspends and enabled=false resumes it. Existing state-change rules apply.\",\n tags: [\"SRS\"],\n })\n .errors(\n pickPublicErrorMap(\n \"CARD_NOT_FOUND\",\n \"CARD_ALREADY_SUSPENDED\",\n \"CARD_NOT_SUSPENDED\",\n \"CARD_STATUS_CHANGE_UNAVAILABLE\",\n ),\n )\n .input(srsSetCardSuspendedInputSchema)\n .output(srsSetCardSuspendedOutputSchema),\n};\n","import { z } from \"zod\";\n\nexport const notebaseActivityStatsItemSchema = z\n .object({\n date: z.iso.date(),\n notes: z.number().int().nonnegative(),\n })\n .strict();\nexport type NotebaseActivityStatsItem = z.infer<typeof notebaseActivityStatsItemSchema>;\n\nexport const notebaseActivityStatsOutputSchema = z\n .object({\n daily: z.array(notebaseActivityStatsItemSchema),\n })\n .strict();\nexport type NotebaseActivityStatsOutput = z.infer<typeof notebaseActivityStatsOutputSchema>;\n\nexport const notebaseRowGrowthStatsItemSchema = z\n .object({\n date: z.iso.date(),\n delta: z.number().int(),\n })\n .strict();\nexport type NotebaseRowGrowthStatsItem = z.infer<typeof notebaseRowGrowthStatsItemSchema>;\n\nexport const notebaseRowGrowthStatsOutputSchema = z\n .object({\n baseTotal: z.number().int().nonnegative(),\n daily: z.array(notebaseRowGrowthStatsItemSchema),\n })\n .strict();\nexport type NotebaseRowGrowthStatsOutput = z.infer<typeof notebaseRowGrowthStatsOutputSchema>;\n","import { z } from \"zod\";\n\nexport const srsActivityStatsItemSchema = z\n .object({\n date: z.iso.date(),\n answers: z.number().int().nonnegative(),\n durationMs: z.number().int().nonnegative(),\n })\n .strict();\nexport type SrsActivityStatsItem = z.infer<typeof srsActivityStatsItemSchema>;\n\nexport const srsActivityStatsOutputSchema = z\n .object({\n learnedCards: z.number().int().nonnegative(),\n daily: z.array(srsActivityStatsItemSchema),\n })\n .strict();\nexport type SrsActivityStatsOutput = z.infer<typeof srsActivityStatsOutputSchema>;\n\nexport const srsMemoryGrowthStatsItemSchema = z\n .object({\n date: z.iso.date(),\n delta: z.number().int(),\n })\n .strict();\nexport type SrsMemoryGrowthStatsItem = z.infer<typeof srsMemoryGrowthStatsItemSchema>;\n\nexport const srsMemoryGrowthStatsOutputSchema = z\n .object({\n baseTotal: z.number().int().nonnegative(),\n daily: z.array(srsMemoryGrowthStatsItemSchema),\n })\n .strict();\nexport type SrsMemoryGrowthStatsOutput = z.infer<typeof srsMemoryGrowthStatsOutputSchema>;\n","import { z } from \"zod\";\nimport { notebaseActivityStatsOutputSchema } from \"./notebase-stats\";\nimport { srsActivityStatsOutputSchema } from \"./srs-stats\";\nimport { canonicalTimezoneSchema } from \"./timezone\";\n\nconst statsNotebaseIdsSchema = z\n .array(z.uuid())\n .min(1)\n .transform((ids) => Array.from(new Set(ids)));\n\nexport const statsInputSchema = z\n .object({\n notebaseIds: statsNotebaseIdsSchema.optional(),\n from: z.iso.date().optional(),\n to: z.iso.date(),\n timezone: canonicalTimezoneSchema,\n })\n .strict()\n .refine((input) => !input.from || input.from <= input.to, {\n message: \"from must be before or equal to to\",\n path: [\"from\"],\n });\nexport type StatsInput = z.infer<typeof statsInputSchema>;\n\nexport const activityStatsOutputSchema = z\n .object({\n srs: srsActivityStatsOutputSchema,\n notebase: notebaseActivityStatsOutputSchema,\n })\n .strict();\nexport type ActivityStatsOutput = z.infer<typeof activityStatsOutputSchema>;\n","import { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport { notebaseRowGrowthStatsOutputSchema } from \"#/schemas/notebase-stats\";\nimport { srsMemoryGrowthStatsOutputSchema } from \"#/schemas/srs-stats\";\nimport { activityStatsOutputSchema, statsInputSchema } from \"#/schemas/stats\";\n\nexport const statsContract = {\n activity: oc\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .route({\n method: \"GET\",\n path: \"/stats/activity\",\n summary: \"Get SRS and notebase activity statistics\",\n tags: [\"Statistics\"],\n })\n .input(statsInputSchema)\n .output(activityStatsOutputSchema),\n\n srsMemoryGrowth: oc\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .route({\n method: \"GET\",\n path: \"/srs/stats/memory-growth\",\n summary: \"Get SRS long-term memory growth statistics\",\n tags: [\"Statistics\"],\n })\n .input(statsInputSchema)\n .output(srsMemoryGrowthStatsOutputSchema),\n\n notebaseRowGrowth: oc\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .route({\n method: \"GET\",\n path: \"/notebases/stats/row-growth\",\n summary: \"Get notebase row growth statistics\",\n tags: [\"Statistics\"],\n })\n .input(statsInputSchema)\n .output(notebaseRowGrowthStatsOutputSchema),\n};\n","import { z } from \"zod\";\nimport { appLocaleSchema } from \"./app-locale\";\nimport { timezoneSchema } from \"./timezone\";\n\nexport const userEnsureTimezoneInputSchema = z\n .object({\n timezone: timezoneSchema,\n })\n .strict();\nexport type UserEnsureTimezoneInput = z.infer<typeof userEnsureTimezoneInputSchema>;\n\nexport const userEnsureTimezoneOutputSchema = z\n .object({\n timezone: timezoneSchema,\n updated: z.boolean(),\n })\n .strict();\nexport type UserEnsureTimezoneOutput = z.infer<typeof userEnsureTimezoneOutputSchema>;\n\nexport const userUpdateTimezoneInputSchema = z\n .object({\n timezone: timezoneSchema,\n })\n .strict();\nexport type UserUpdateTimezoneInput = z.infer<typeof userUpdateTimezoneInputSchema>;\n\nexport const userUpdateTimezoneOutputSchema = z\n .object({\n timezone: timezoneSchema,\n })\n .strict();\nexport type UserUpdateTimezoneOutput = z.infer<typeof userUpdateTimezoneOutputSchema>;\n\n// The account's language, which emails are written in. `ensureLocale` only\n// fills it in when it is empty (the language www is showing on a signed-in\n// visit); `updateLocale` is the user choosing a language.\nexport const userEnsureLocaleInputSchema = z\n .object({\n locale: appLocaleSchema,\n })\n .strict();\nexport type UserEnsureLocaleInput = z.infer<typeof userEnsureLocaleInputSchema>;\n\nexport const userEnsureLocaleOutputSchema = z\n .object({\n locale: appLocaleSchema,\n updated: z.boolean(),\n })\n .strict();\nexport type UserEnsureLocaleOutput = z.infer<typeof userEnsureLocaleOutputSchema>;\n\nexport const userUpdateLocaleInputSchema = z\n .object({\n locale: appLocaleSchema,\n })\n .strict();\nexport type UserUpdateLocaleInput = z.infer<typeof userUpdateLocaleInputSchema>;\n\nexport const userUpdateLocaleOutputSchema = z\n .object({\n locale: appLocaleSchema,\n })\n .strict();\nexport type UserUpdateLocaleOutput = z.infer<typeof userUpdateLocaleOutputSchema>;\n","import { oc } from \"@orpc/contract\";\nimport {\n userEnsureLocaleInputSchema,\n userEnsureLocaleOutputSchema,\n userEnsureTimezoneInputSchema,\n userEnsureTimezoneOutputSchema,\n userUpdateLocaleInputSchema,\n userUpdateLocaleOutputSchema,\n userUpdateTimezoneInputSchema,\n userUpdateTimezoneOutputSchema,\n} from \"#/schemas/user\";\n\nexport const userContract = {\n ensureTimezone: oc\n .route({\n method: \"POST\",\n path: \"/users/me/timezone/ensure\",\n summary: \"Ensure the authenticated user has a timezone\",\n tags: [\"Users\"],\n })\n .input(userEnsureTimezoneInputSchema)\n .output(userEnsureTimezoneOutputSchema),\n updateTimezone: oc\n .route({\n method: \"PATCH\",\n path: \"/users/me/timezone\",\n summary: \"Update the authenticated user's timezone\",\n tags: [\"Users\"],\n })\n .input(userUpdateTimezoneInputSchema)\n .output(userUpdateTimezoneOutputSchema),\n ensureLocale: oc\n .route({\n method: \"POST\",\n path: \"/users/me/locale/ensure\",\n summary: \"Ensure the authenticated user has a locale\",\n tags: [\"Users\"],\n })\n .input(userEnsureLocaleInputSchema)\n .output(userEnsureLocaleOutputSchema),\n updateLocale: oc\n .route({\n method: \"PATCH\",\n path: \"/users/me/locale\",\n summary: \"Update the authenticated user's locale\",\n tags: [\"Users\"],\n })\n .input(userUpdateLocaleInputSchema)\n .output(userUpdateLocaleOutputSchema),\n};\n","import { getVideoIdFromUrl, transcriptSegmentSchema } from \"@read-frog/definitions\";\nimport { z } from \"zod\";\nimport { billingPlanSchema } from \"./billing\";\n\nexport const videoTranscriptStatusSchema = z.enum([\"pending\", \"processing\", \"completed\", \"failed\"]);\nexport type VideoTranscriptStatus = z.infer<typeof videoTranscriptStatusSchema>;\n\n// The transcript \"job\" resource: status + metadata, without the (heavy) segments payload.\nexport const videoTranscriptResourceSchema = z.object({\n id: z.string(),\n platform: z.string(),\n videoId: z.string(),\n url: z.string(),\n status: videoTranscriptStatusSchema,\n title: z.string().nullable(),\n durationSec: z.number().nullable(),\n detectedLanguage: z.string().nullable(),\n error: z.string().nullable(),\n createdAt: z.date(),\n updatedAt: z.date(),\n});\nexport type VideoTranscriptResource = z.infer<typeof videoTranscriptResourceSchema>;\n\n// The subtitles sub-resource: the segments + model-detected language, only available once completed.\nexport const videoTranscriptSubtitlesSchema = z.object({\n id: z.string(),\n detectedLanguage: z.string().nullable(),\n segments: z.array(transcriptSegmentSchema),\n});\nexport type VideoTranscriptSubtitles = z.infer<typeof videoTranscriptSubtitlesSchema>;\n\nexport const videoTranscriptCreateInputSchema = z\n .object({\n url: z.url().refine((url) => getVideoIdFromUrl(url) !== null, {\n message: \"url must be a supported video URL\",\n }),\n // The player's own duration, read from the media element. REQUIRED, and an\n // untrusted UX hint only: admission uses it to reject an over-quota request\n // instantly, but every reservation and charge is made against the\n // server-measured duration in the worker — lying here changes nothing about\n // what gets billed.\n durationSec: z.number().int().positive(),\n })\n .strict();\nexport type VideoTranscriptCreateInput = z.infer<typeof videoTranscriptCreateInputSchema>;\n\nexport const videoTranscriptGetInputSchema = z\n .object({\n id: z.uuid(),\n })\n .strict();\nexport type VideoTranscriptGetInput = z.infer<typeof videoTranscriptGetInputSchema>;\n\n// One quota pool as shown to the user. `resetAt` is null for a one-time grant\n// (it never resets); `expiresAt` is null for a monthly pool (its end is the\n// reset). Minutes are display units: `usedMinutes` rounds up and\n// `limitMinutes` rounds down, so the UI can never show headroom that\n// admission (which compares raw seconds) would deny.\nexport const videoTranscriptUsagePoolSchema = z.object({\n id: z.string(),\n usedMinutes: z.number().int(),\n limitMinutes: z.number().int(),\n remainingMinutes: z.number().int(),\n resetAt: z.iso.datetime().nullable(),\n expiresAt: z.iso.datetime().nullable(),\n});\nexport type VideoTranscriptUsagePool = z.infer<typeof videoTranscriptUsagePoolSchema>;\n\n// The caller's transcription quota usage. Totals aggregate across pools;\n// `remainingMinutes` nets out in-flight reservations (committed), while each\n// pool's `usedMinutes` shows settled spend only, so a progress bar cannot run\n// forward and then backwards when a job is released. Deliberately a non-strict\n// object: old clients strip the keys they don't know.\nexport const videoTranscriptUsageSchema = z.object({\n usedMinutes: z.number().int(),\n limitMinutes: z.number().int(),\n remainingMinutes: z.number().int(),\n plan: billingPlanSchema,\n pools: z.array(videoTranscriptUsagePoolSchema),\n});\nexport type VideoTranscriptUsage = z.infer<typeof videoTranscriptUsageSchema>;\n","import { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n videoTranscriptCreateInputSchema,\n videoTranscriptGetInputSchema,\n videoTranscriptResourceSchema,\n videoTranscriptSubtitlesSchema,\n videoTranscriptUsageSchema,\n} from \"#/schemas/video-transcript\";\n\nexport const videoTranscriptContract = {\n create: oc\n .errors(\n pickPublicErrorMap(\n \"VIDEO_TRANSCRIPTION_QUOTA_EXCEEDED\",\n \"VIDEO_TRANSCRIPTION_SUBSCRIPTION_REQUIRED\",\n \"VIDEO_TRANSCRIPTION_PAYMENT_REQUIRED\",\n \"VIDEO_TRANSCRIPTION_UNSUPPORTED_LENGTH\",\n ),\n )\n .route({\n method: \"POST\",\n path: \"/video-transcripts\",\n summary: \"Create or reuse a video transcription job\",\n tags: [\"Video Transcription\"],\n })\n .input(videoTranscriptCreateInputSchema)\n .output(videoTranscriptResourceSchema),\n getUsage: oc\n .route({\n method: \"GET\",\n path: \"/video-transcripts/usage\",\n summary: \"Get the caller's monthly transcription quota usage\",\n tags: [\"Video Transcription\"],\n })\n .output(videoTranscriptUsageSchema),\n get: oc\n .errors(\n pickPublicErrorMap(\"VIDEO_TRANSCRIPT_NOT_FOUND\", \"VIDEO_TRANSCRIPTION_SUBSCRIPTION_REQUIRED\"),\n )\n .route({\n method: \"GET\",\n path: \"/video-transcripts/{id}\",\n summary: \"Get a video transcription job's status\",\n tags: [\"Video Transcription\"],\n })\n .input(videoTranscriptGetInputSchema)\n .output(videoTranscriptResourceSchema),\n getSubtitles: oc\n .errors(\n pickPublicErrorMap(\n \"VIDEO_TRANSCRIPT_NOT_FOUND\",\n \"VIDEO_TRANSCRIPT_NOT_READY\",\n \"VIDEO_TRANSCRIPTION_SUBSCRIPTION_REQUIRED\",\n ),\n )\n .route({\n method: \"GET\",\n path: \"/video-transcripts/{id}/subtitles\",\n summary: \"Get a completed video transcript's subtitles\",\n tags: [\"Video Transcription\"],\n })\n .input(videoTranscriptGetInputSchema)\n .output(videoTranscriptSubtitlesSchema),\n};\n","import type { ContractRouterClient } from \"@orpc/contract\";\nimport { billingContract } from \"./contracts/billing\";\nimport { cardContract } from \"./contracts/card\";\nimport { cardTemplateContract } from \"./contracts/card-template\";\nimport { ebookContract } from \"./contracts/ebook\";\nimport { emailPreferencesContract } from \"./contracts/email-preferences\";\nimport { featureAccessContract } from \"./contracts/feature-access\";\nimport { hostedAiContract } from \"./contracts/hosted-ai\";\nimport { masteryGoalContract } from \"./contracts/mastery-goal\";\nimport { mcpConnectionContract } from \"./contracts/mcp-connection\";\nimport { notebaseContract } from \"./contracts/notebase\";\nimport { notebaseColumnContract } from \"./contracts/notebase-column\";\nimport { notebaseRowContract } from \"./contracts/notebase-row\";\nimport { speechContract } from \"./contracts/speech\";\nimport { srsContract } from \"./contracts/srs\";\nimport { statsContract } from \"./contracts/stats\";\nimport { userContract } from \"./contracts/user\";\nimport { videoTranscriptContract } from \"./contracts/video-transcript\";\n\nexport const contract = {\n billing: billingContract,\n card: cardContract,\n cardTemplate: cardTemplateContract,\n ebook: ebookContract,\n emailPreferences: emailPreferencesContract,\n featureAccess: featureAccessContract,\n hostedAi: hostedAiContract,\n masteryGoal: masteryGoalContract,\n mcpConnection: mcpConnectionContract,\n notebase: notebaseContract,\n notebaseColumn: notebaseColumnContract,\n notebaseRow: notebaseRowContract,\n speech: speechContract,\n srs: srsContract,\n stats: statsContract,\n user: userContract,\n videoTranscript: videoTranscriptContract,\n};\n\nexport type ORPCRouterClient = ContractRouterClient<typeof contract>;\n\nexport { type AgentRoute, defineAgentProcedure } from \"./contracts/shared\";\nexport * from \"./public-errors\";\nexport * from \"./schemas/app-locale\";\nexport * from \"./schemas/billing\";\nexport * from \"./schemas/card\";\nexport * from \"./schemas/ebook\";\nexport * from \"./schemas/email-preferences\";\nexport * from \"./schemas/feature-access\";\nexport * from \"./schemas/hosted-ai\";\nexport * from \"./schemas/mastery-goal\";\nexport * from \"./schemas/mcp-connection\";\nexport * from \"./schemas/notebase\";\nexport * from \"./schemas/notebase-column\";\nexport * from \"./schemas/notebase-row\";\nexport * from \"./schemas/notebase-stats\";\nexport * from \"./schemas/notebase-view\";\nexport * from \"./schemas/speech\";\nexport * from \"./schemas/srs\";\nexport * from \"./schemas/srs-stats\";\nexport * from \"./schemas/stats\";\nexport * from \"./schemas/timezone\";\nexport * from \"./schemas/user\";\nexport * from \"./schemas/video-transcript\";\n\nexport * from \"./schemas/pagination\";\nexport * from \"./schemas/resource-mutation\";\n"],"mappings":";;;;AAEA,MAAa,gCAAgC,EAAE,KAAK,CAAC,UAAU,QAAQ,CAAC;AAExE,MAAa,4BAA4B,EAAE,aAAa;CACtD,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;CACrC,MAAM;AACR,CAAC;AAED,MAAM,6BAA6B,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAK;;;;;;AAOrE,MAAa,0BAA0B,EAAE,KAAK,CAAC,UAAU,SAAS,CAAC;;;;;;;;;AASnE,MAAa,wBAAwB,EAAE,KAAK;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,MAAa,0BAA0B,EAAE,KAAK;AAE9C,MAAM,gCAAgC;;;;;;;;;;;CAWpC,WAAW,wBAAwB,QAAQ,QAAQ;CACnD,WAAW,wBAAwB,SAAS;AAC9C;AAEA,MAAa,gCAAgC,EAAE,aAAa;CAC1D,GAAG;CACH,cAAc;CACd,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAK;CAC1C,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;AACjD,CAAC;AAED,MAAa,4CAA4C,EACtD,aAAa;CACZ,GAAG;CACH,cAAc;CACd,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAK;CAC1C,cAAc,EAAE,MAAM,yBAAyB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;CAC9D,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;AACjD,CAAC,CAAC,CACD,aAAa,OAAO,QAAQ;CAC3B,MAAM,6BAAa,IAAI,IAAY;CAEnC,MAAM,aAAa,SAAS,OAAO,UAAU;EAC3C,IAAI,WAAW,IAAI,MAAM,IAAI,GAAG;GAC9B,IAAI,SAAS;IACX,MAAM;IACN,SAAS,iCAAiC,MAAM,KAAK;IACrD,MAAM;KAAC;KAAgB;KAAO;IAAM;GACtC,CAAC;GACD;EACF;EAEA,WAAW,IAAI,MAAM,IAAI;CAC3B,CAAC;AACH,CAAC;AAEH,MAAa,sCAAsC;AACnD,MAAa,4CAA4C;AAEzD,MAAa,0CAA0C,EAAE,aAAa;CACpE,GAAG;CACH,cAAc;CACd,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAK;CAC1C,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;AACjD,CAAC;;;;;;;;;AAUD,MAAa,qCAAqC,EAAE,aAAa;CAC/D,QAAQ,EAAE,aAAa;EACrB,2BAA2B,EAAE,QAAQ;EACrC,gBAAgB,EAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS;;;;;;;EAO7C,kBAAkB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS;CAChD,CAAC;CACD,OAAO,EACJ,MACC,EAAE,aAAa,EACb,QAAQ,EACL,MACC,EAAE,aAAa;EACb,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE;EACvB,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;CACpD,CAAC,CACH,CAAC,CACA,IAAA,EAA6C,EAClD,CAAC,CACH,CAAC,CACA,IAAA,CAAuC;AAC5C,CAAC;AAED,MAAa,2BAA2B,EAAE,YAAY,EACpD,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAC/B,CAAC;;;;;;;;;;;;AAaD,MAAa,qCAAqC;CAChD;CACA;CACA;CACA;CACA;CACA;AACF;;;;;;;AAQA,MAAa,4BAA4B,EAAE,OAAO,CAAC,CAAC;AAEpD,MAAa,kCAAkC,EAAE,KAAK;CACpD;CACA;CACA;CACA;AACF,CAAC;AAED,MAAa,+BAA+B,EAAE,KAAK;CACjD;CACA;CACA;CACA;AACF,CAAC;AAED,MAAa,iCAAiC,EAAE,KAAK,CAAC,SAAS,QAAQ,CAAC;AAExE,MAAa,2BAA2B,EAAE,KAAK,CAAC,SAAS,MAAM,CAAC;;;;;;;;;;;;;;AAehE,MAAa,mCAAmC,EAAE,OAAO;CACvD,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;CACpC,YAAY;AACd,CAAC;;;;;;;;;;;AAYD,MAAa,sCAAsC,EAAE,aAAa;CAChE,YAAY;CACZ,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;CACtC,SAAS,EAAE,IAAI,SAAS,CAAC,CAAC,SAAS;;;;;;CAMnC,UAAU,EAAE,MAAM,qBAAqB,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;;;;;;;;AASD,MAAa,oCAAoC,EAAE,aAAa;CAC9D,YAAY,EAAE,QAAQ,MAAM;CAC5B,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;CACtC,WAAW,EAAE,IAAI,SAAS;CAC1B,UAAU,EAAE,MAAM,qBAAqB,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;;;;;;AAOD,MAAa,iCAAiC,EAAE,mBAAmB,cAAc,CAC/E,qCACA,iCACF,CAAC;AAED,MAAa,2BAA2B,EAAE,aAAa;CACrD,eAAe,EAAE,QAAQ;CACzB,WAAW,EAAE,QAAQ;CACrB,mBAAmB,gCAAgC,SAAS;;;;;;;CAO5D,eAAe,EAAE,QAAQ;CACzB,eAAe,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,MAAa,8BAA8B,EAAE,aAAa;CACxD,QAAQ;CACR,SAAS;AACX,CAAC;AAED,MAAa,6BAA6B,EAAE,aAAa;;;;;;;;;CASvD,SAAS,EAAE,MAAM,mCAAmC;;;;;;CAMpD,OAAO,EAAE,MAAM,8BAA8B;CAC7C,UAAU,EAAE,aAAa;EACvB,iBAAiB;EACjB,cAAc;EACd,gBAAgB;EAChB,sBAAsB;EACtB,gBAAgB;EAChB,kBAAkB;EAClB,mBAAmB;CACrB,CAAC;AACH,CAAC;;;ACrRD,MAAa,oCAAoC,EAAE,KAAK;CACtD;CACA;CACA;CACA;AACF,CAAC;AAGD,MAAa,qCAAqC,EAC/C,OAAO;CACN,gBAAgB,EAAE,OAAO,CAAC,CAAC,SAAS;CACpC,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS;CAClC,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS;CAClC,eAAe,EAAE,QAAQ,CAAC,CAAC,SAAS;CACpC,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;AAC7C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO;CACN,kBAAkB,EAAE,OAAO;CAC3B,SAAS;CACT,QAAQ;;CAER,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;AAC7C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,uCAAuC,EACjD,OAAO,EACN,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,EACvC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,sCAAsC,EAChD,OAAO,EACN,QAAQ,EAAE,MACR,EACG,OAAO;CACN,MAAM,EAAE,KAAK,CAAC,SAAS,MAAM,CAAC;CAC9B,SAAS,EAAE,OAAO;CAElB,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;CACvC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;AACvC,CAAC,CAAC,CACD,OAAO,CACZ,EACF,CAAC,CAAC,CACD,OAAO;AAIV,MAAa,4CAA4C,EACtD,OAAO,EACN,WAAW,EAAE,MAAM,EAAE,OAAO;CAAE,IAAI,EAAE,KAAK;CAAG,MAAM,EAAE,OAAO;AAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAC1E,CAAC,CAAC,CACD,OAAO;AAKV,MAAa,mCAAmC,EAAE,aAAa,EAC7D,WAAW,wBACb,CAAC;AAED,MAAa,mCAAmC,EAAE,aAAa;CAC7D,WAAW;CAKX,UAAU;CACV,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;CACtC,SAAS,EAAE,IAAI,SAAS,CAAC,CAAC,SAAS;AACrC,CAAC;AAED,MAAa,oCAAoC,EAAE,aAAa;CAC9D,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;CAC7B,SAAS,EAAE,IAAI,SAAS;AAC1B,CAAC;AAED,MAAa,wBAAwB;CACnC,0BAA0B;EACxB,SAAS;EACT,QAAQ;CACV;CACA,yBAAyB;EAAE,SAAS;EAA2C,QAAQ;CAAI;CAC3F,+BAA+B;EAC7B,SAAS;EACT,QAAQ;CACV;CACA,2BAA2B;EACzB,MAAM;EACN,SAAS;EACT,QAAQ;CACV;CACA,2BAA2B;EACzB,MAAM;EACN,SAAS;EACT,QAAQ;CACV;CACA,oBAAoB;EAClB,SAAS;EACT,QAAQ;CACV;CACA,2CAA2C;EACzC,SAAS;EACT,QAAQ;CACV;CAMA,sCAAsC;EACpC,SAAS;EACT,QAAQ;CACV;CACA,4BAA4B;EAC1B,SAAS;EACT,QAAQ;CACV;CACA,4BAA4B;EAC1B,SAAS;EACT,QAAQ;CACV;CACA,oCAAoC;EAClC,SAAS;EACT,QAAQ;CACV;CAIA,wCAAwC;EACtC,SAAS;EACT,QAAQ;CACV;CAEA,4BAA4B;EAC1B,MAAM;EACN,SAAS;EACT,QAAQ;CACV;CAEA,oBAAoB;EAClB,SAAS;EACT,QAAQ;CACV;CACA,2BAA2B;EACzB,SAAS;EACT,QAAQ;CACV;CACA,wBAAwB;EACtB,SAAS;EACT,QAAQ;CACV;CACA,gBAAgB;EACd,SAAS;EACT,QAAQ;CACV;CACA,yBAAyB;EACvB,SAAS;EACT,QAAQ;CACV;CACA,wCAAwC;EACtC,MAAM;EACN,SAAS;EACT,QAAQ;CACV;CACA,8BAA8B;EAC5B,MAAM;EACN,SAAS;EACT,QAAQ;CACV;CACA,sCAAsC;EACpC,MAAM;EACN,SAAS;EACT,QAAQ;CACV;CACA,qBAAqB;EACnB,SAAS;EACT,QAAQ;CACV;CACA,wBAAwB;EACtB,SAAS;EACT,QAAQ;CACV;CACA,4BAA4B;EAC1B,SAAS;EACT,QAAQ;CACV;CACA,qBAAqB;EACnB,SAAS;EACT,QAAQ;CACV;CACA,0BAA0B;EACxB,SAAS;EACT,QAAQ;CACV;CACA,qBAAqB;EACnB,SAAS;EACT,QAAQ;CACV;CACA,yBAAyB;EACvB,SAAS;EACT,QAAQ;CACV;CACA,kCAAkC;EAChC,SAAS;EACT,QAAQ;CACV;CACA,qBAAqB;EACnB,SAAS;EACT,QAAQ;CACV;CACA,iBAAiB;EACf,SAAS;EACT,QAAQ;CACV;CACA,wBAAwB;EACtB,SAAS;EACT,QAAQ;CACV;CACA,oBAAoB;EAClB,SAAS;EACT,QAAQ;CACV;CACA,gCAAgC;EAC9B,SAAS;EACT,QAAQ;CACV;CACA,yBAAyB;EACvB,SAAS;EACT,QAAQ;CACV;CACA,wBAAwB;EACtB,MAAM;EACN,SAAS;EACT,QAAQ;CACV;CACA,4CAA4C;EAC1C,SAAS;EACT,QAAQ;CACV;CACA,8BAA8B;EAC5B,SAAS;EACT,QAAQ;CACV;CACA,uBAAuB;EACrB,SAAS;EACT,QAAQ;CACV;CACA,iBAAiB;EACf,SAAS;EACT,QAAQ;CACV;CACA,sBAAsB;EACpB,SAAS;EACT,QAAQ;CACV;CACA,sBAAsB;EACpB,SAAS;EACT,QAAQ;CACV;CACA,4BAA4B;EAC1B,SAAS;EACT,QAAQ;CACV;CAGA,oBAAoB;EAClB,SAAS;EACT,QAAQ;CACV;AACF;AASA,SAAgB,qBAAqB,MAAsD;CACzF,OAAO,SAAS,KAAA,KAAa,QAAQ;AACvC;AAEA,SAAgB,yBAA2D,MAAa;CACtF,OAAO,sBAAsB;AAC/B;AAEA,SAAgB,mBACd,GAAG,OACH;CACA,OAAO,OAAO,YACZ,MAAM,KAAK,SAAS;EAClB,MAAM,aAAa,sBAAsB;EAEzC,IAAI,UAAU,YACZ,OAAO,CACL,MACA;GACE,MAAM,WAAW;GACjB,SAAS,WAAW;GACpB,QAAQ,WAAW;EACrB,CACF;EAGF,OAAO,CACL,MACA;GACE,SAAS,WAAW;GACpB,QAAQ,WAAW;EACrB,CACF;CACF,CAAC,CACH;AACF;;;;;;;;ACpUA,MAAa,kBAAkB,EAAE,KAAK;CAAC;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;AAAO,CAAC;;;ACH/F,MAAa,wBAAwB,EAAE,KAAK,CAAC,SAAS,MAAM,CAAC;AAG7D,MAAa,kCAAkC,EAAE,KAAK;CACpD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAGD,MAAa,oBAAoB,EAAE,KAAK;CAAC;CAAQ;CAAO;AAAO,CAAC;;;;;;;;;;;AAahE,MAAa,wBAAwB;CACnC,MAAM;CACN,KAAK;CACL,OAAO;AACT;AAGA,MAAa,4BAA4B,EAAE,KAAK,CAAC,OAAO,OAAO,CAAC;AAGhE,MAAa,wBAAwB,EAAE,KAAK;CAAC;CAAO;CAAO;AAAK,CAAC;AAKjE,MAAa,sBAAsB;AAGnC,MAAa,4BAA4B,EAAE,KAAK,CAAC,gBAAgB,MAAM,CAAC;AAGxE,MAAa,+BAA+B,EACzC,OAAO;CACN,MAAM;CACN,UAAU;CACV,aAAa,EAAE,OAAO,KAAK;AAC7B,CAAC,CAAC,CACD,OAAO;;;;;;AAQV,MAAa,gCAAgC;;;;;;AAO7C,MAAa,0BAA0B,EACpC,OAAO;;CAEN,OAAO,EAAE,OAAO,KAAK;;;;;CAKrB,MAAM;;CAEN,KAAK,EAAE,IAAI,CAAC,CAAC,SAAS;AACxB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,sBAAsB,EAChC,OAAO;CACN,MAAM;CACN,QAAQ,gCAAgC,SAAS;CACjD,UAAU,sBAAsB,SAAS;CACzC,kBAAkB,EAAE,OAAO,KAAK,CAAC,CAAC,SAAS;;;;;;;CAO3C,UAAU,EAAE,OAAO,KAAK,CAAC,CAAC,SAAS;CACnC,cAAc,0BAA0B,SAAS;CACjD,iBAAiB,6BAA6B,SAAS;CACvD,YAAY,wBAAwB,SAAS;CAC7C,wBAAwB,EAAE,QAAQ;CAClC,mBAAmB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS;CAC7C,mBAAmB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,0CAA0C,EACpD,OAAO;CACN,UAAU;CACV,UAAU;CACV,QAAQ;CACR,MAAM,0BAA0B,QAAQ,KAAK;AAC/C,CAAC,CAAC,CACD,OAAO;AAKV,MAAa,gDAAgD,EAC1D,OAAO,EACN,QAAQ,gBACV,CAAC,CAAC,CACD,OAAO;AAKV,MAAa,gCAAgC,EAC1C,OAAO,EACN,KAAK,EAAE,IAAI,EACb,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,2CAA2C,EACrD,OAAO,EACN,SAAS,EAAE,QAAQ,IAAI,EACzB,CAAC,CAAC,CACD,OAAO;;;ACtIV,MAAM,mBAAmB,GAAG,OAC1B,mBACE,0BACA,8BACA,uBACA,0BACF,CACF;AAEA,MAAa,kBAAkB;CAC7B,QAAQ,iBACL,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,SAAS;CAClB,CAAC,CAAC,CACD,OAAO,mBAAmB;CAC7B,uBAAuB,iBACpB,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,SAAS;CAClB,CAAC,CAAC,CACD,MAAM,uCAAuC,CAAC,CAC9C,OAAO,6BAA6B;CACvC,6BAA6B,iBAC1B,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,SAAS;CAClB,CAAC,CAAC,CACD,MAAM,6CAA6C,CAAC,CACpD,OAAO,6BAA6B;CACvC,uBAAuB,iBACpB,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,SAAS;CAClB,CAAC,CAAC,CACD,OAAO,wCAAwC;AACpD;;;;;;;;;;;;ACnCA,SAAgB,qBAAqB,OAAmB;CACtD,OAAO,GAAG,MAAM;EAAE,SAAS,MAAM;EAAS,aAAa,MAAM;CAAY,CAAC,CAAC,CAAC,MAAM,KAAK;AACzF;;;ACpBA,MAAa,kBAAkB;CAE7B,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS;CACjD,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;AAC3C;AACA,SAAgB,WAAgC,YAAe;CAC7D,OAAO,EAAE,OAAO;EAAE,OAAO,EAAE,MAAM,UAAU;EAAG,SAAS,EAAE,QAAQ;CAAE,CAAC;AACtE;;;ACPA,MAAa,0BAA0B,EAAE,IAAI,SAAS,EAAE,QAAQ,KAAK,CAAC;AACtE,MAAa,uBAAuB,EAAE,OAAO;CAC3C,IAAI,EAAE,KAAK;CACX,MAAM,EAAE,OAAO;AACjB,CAAC;;;ACUD,MAAa,qBAAqB,EAAE,OAAO;CACzC,IAAI,EAAE,KAAK;CACX,YAAY,EAAE,KAAK;CACnB,MAAM,EAAE,OAAO;CACf,QAAQ;CACR,WAAW,4BAA4B,SACrC,0HACF;CACA,WAAW,EAAE,OAAO,KAAK;CACzB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC;AAGD,MAAa,8BAA8B,EAAE,OAAO;CAClD,GAAG;CACH,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS;AAChC,CAAC;AAGD,MAAa,+BAA+B,WAAW,kBAAkB;AAGzE,MAAa,6BAA6B,EAAE,OAAO,EACjD,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,8BAA8B;AAG3C,MAAa,gCAAgC,EAC1C,OAAO;CACN,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;CACtB,YAAY,EAAE,KAAK;CACnB,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,QAAQ;AACV,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,mBAAmB,OAAO,EACtE,MAAM,EAAE,OAAO,EACjB,CAAC;AAGD,MAAa,gCAAgC,EAC1C,OAAO;CACN,mBAAmB,wBAAwB,SAAS;CACpD,IAAI,EAAE,KAAK;CACX,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;CACjC,QAAQ,yBAAyB,SAAS;AAC5C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,mBAAmB,OAAO,EACtE,MAAM,EAAE,OAAO,EACjB,CAAC;AAGD,MAAa,gCAAgC,EAAE,OAAO,EACpD,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,iCAAiC;AAG9C,MAAa,aAAa,EAAE,OAAO;CACjC,GAAG;CACH,GAAG;CACH,WAAW,EAAE,OAAO,KAAK;CACzB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC;AAGD,MAAa,qBAAqB,WAAW,OAAO;CAClD,OAAO,EAAE,OAAO;CAChB,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,sBAAsB,EAAE,OAAO;CAC1C,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS;CAC9B,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS;CAC9B,gBAAgB,qBAAqB,SAAS;CAC9C,GAAG;AACL,CAAC;AAGD,MAAa,uBAAuB,WAAW,kBAAkB;AAGjE,MAAa,qBAAqB,EAAE,OAAO,EACzC,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,sBAAsB;AAGnC,MAAa,0BAA0B,EAAE,OAAO;CAC9C,YAAY,EAAE,KAAK;CACnB,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS;AAChC,CAAC;AAGD,MAAa,2BAA2B,EAAE,OAAO;CAC/C,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;CAC/B,MAAM,EAAE,OAAO;AACjB,CAAC;;;ACjHD,MAAa,eAAe;CAC1B,MAAM,qBAAqB;EACzB,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,mBAAmB,CAAC,CAC1B,OAAO,oBAAoB;CAE9B,KAAK,qBAAqB;EACxB,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACC,OAAO,mBAAmB,gBAAgB,CAAC,CAAC,CAC5C,MAAM,kBAAkB,CAAC,CACzB,OAAO,mBAAmB;CAE7B,UAAU,GACP,OAAO,mBAAmB,sBAAsB,yBAAyB,CAAC,CAAC,CAC3E,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACD,MAAM,uBAAuB,CAAC,CAC9B,OAAO,wBAAwB;AACpC;;;AChCA,MAAa,uBAAuB;CAClC,MAAM,qBAAqB;EACzB,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,gBAAgB;CACzB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,2BAA2B,CAAC,CAClC,OAAO,4BAA4B;CAEtC,KAAK,qBAAqB;EACxB,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACb,MAAM,CAAC,gBAAgB;CACzB,CAAC,CAAC,CACC,OAAO,mBAAmB,yBAAyB,CAAC,CAAC,CACrD,MAAM,0BAA0B,CAAC,CACjC,OAAO,2BAA2B;CAErC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,gBAAgB;CACzB,CAAC,CAAC,CACC,OACC,mBACE,sBACA,0CACA,8BACF,CACF,CAAC,CACA,OAAO,mBAAmB,yBAAyB,CAAC,CAAC,CACrD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CAExC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,gBAAgB;CACzB,CAAC,CAAC,CACC,OACC,mBACE,2BACA,0CACA,8BACF,CACF,CAAC,CACA,OAAO,mBAAmB,0BAA0B,CAAC,CAAC,CACtD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CAExC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,gBAAgB;CACzB,CAAC,CAAC,CACC,OAAO,mBAAmB,yBAAyB,CAAC,CAAC,CACrD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;AAC1C;;;ACrFA,MAAa,oBAAoB,EAAE,KAAK,CAAC,WAAW,OAAO,CAAC;AAG5D,MAAa,8BAA8B,EAAE,KAAK,iCAAiC;AAGnF,MAAa,sBAAsB,EAChC,OAAO;CACN,IAAI,EAAE,KAAK;CACX,OAAO,EAAE,OAAO;CAChB,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;CAC5B,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS;CAC9B,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI;CAC7B,QAAQ;CACR,kBAAkB,EAAE,OAAO;CAC3B,YAAY,EAAE,OAAO,KAAK,CAAC,CAAC,SAAS;CACrC,UAAU,EAAE,IAAI,CAAC,CAAC,SAAS;CAC3B,WAAW,EAAE,OAAO,KAAK;CACzB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,oBAAoB,oBAAoB,OAAO,EAC1D,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS,EACnC,CAAC;AAGD,MAAa,mBAAmB,EAC7B,OAAO;CACN,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;CAE7B,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AAC/B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,uBAAuB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;AAGxD,MAAa,wBAAwB,EAClC,OAAO;CACN,OAAO,EAAE,MAAM,mBAAmB;CAClC,OAAO;AACT,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,sBAAsB,EAChC,OAAO,EACN,IAAI,EAAE,KAAK,EACb,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,uBAAuB,EACjC,OAAO,EACN,OAAO,kBACT,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,gCAAgC,EAC1C,OAAO;CACN,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;CAChC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS;CACrC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS;CAEtC,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;CACpC,OAAO,EACJ,OAAO;EACN,aAAa;EACb,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;CAClC,CAAC,CAAC,CACD,OAAO,CAAC,CACR,SAAS;AACd,CAAC,CAAC,CACD,OAAO;;;;;AAOV,MAAa,6BAA6B,EACvC,OAAO;CACN,KAAK,EAAE,IAAI;CACX,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAC1C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO;CACN,SAAS,EAAE,KAAK;CAChB,QAAQ;CACR,aAAa,2BAA2B,SAAS;CACjD,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO,EACN,SAAS,EAAE,KAAK,EAClB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,kCAAkC,EAC5C,OAAO,EACN,OAAO,oBACT,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO,EACN,IAAI,EAAE,KAAK,EACb,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,kCAAkC,EAC5C,OAAO;CACN,KAAK,EAAE,IAAI;CACX,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,gCAAgC,EAC1C,OAAO;CACN,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,GAAI;CACxB,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,8BAA8B,OAAO,EACjF,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,kCAAkC,EAC5C,OAAO,EACN,YAAY,EAAE,OAAO,KAAK,EAC5B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,wBAAwB,EAClC,OAAO;CACN,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;CAChC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS;AAClD,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,yBAAyB,sBAAsB,OAAO,EACjE,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,0BAA0B,EACpC,OAAO,EACN,OAAO,oBACT,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,yBAAyB,EACnC,OAAO,EACN,IAAI,EAAE,KAAK,EACb,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,0BAA0B,EACpC,OAAO,EACN,IAAI,EAAE,KAAK,EACb,CAAC,CAAC,CACD,OAAO;;;ACpKV,MAAM,iBAAiB;AAEvB,MAAa,gBAAgB;CAC3B,MAAM,eACH,OAAO,mBAAmB,uBAAuB,CAAC,CAAC,CACnD,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,oBAAoB,CAAC,CAC3B,OAAO,qBAAqB;CAE/B,KAAK,eACF,OAAO,mBAAmB,yBAAyB,iBAAiB,CAAC,CAAC,CACtE,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,mBAAmB,CAAC,CAC1B,OAAO,oBAAoB;CAE9B,eAAe,eACZ,OACC,mBAAmB,yBAAyB,wBAAwB,sBAAsB,CAC5F,CAAC,CACA,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CAExC,gBAAgB,eACb,OACC,mBACE,yBACA,mBACA,8BACA,sBACF,CACF,CAAC,CACA,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,8BAA8B,CAAC,CACrC,OAAO,+BAA+B;CAEzC,gBAAgB,eACb,OAAO,mBAAmB,yBAAyB,iBAAiB,CAAC,CAAC,CACtE,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,8BAA8B,CAAC,CACrC,OAAO,+BAA+B;CAEzC,gBAAgB,eACb,OAAO,mBAAmB,yBAAyB,iBAAiB,CAAC,CAAC,CACtE,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,8BAA8B,CAAC,CACrC,OAAO,+BAA+B;CAEzC,QAAQ,eACL,OAAO,mBAAmB,yBAAyB,iBAAiB,CAAC,CAAC,CACtE,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,sBAAsB,CAAC,CAC7B,OAAO,uBAAuB;CAEjC,QAAQ,eACL,OAAO,mBAAmB,yBAAyB,iBAAiB,CAAC,CAAC,CACtE,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,sBAAsB,CAAC,CAC7B,OAAO,uBAAuB;AACnC;;;;AC/GA,MAAa,yBAAyB,EACnC,OAAO,CAAC,CACR,IAAI,EAAE,CAAC,CACP,MAAM,mBAAmB;;AAI5B,MAAa,uBAAuB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI;AAE9D,MAAa,2BAA2B,EACrC,OAAO;CACN,KAAK,EAAE,OAAO;CAEd,MAAM,EAAE,OAAO;CACf,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;CAEjC,YAAY,EAAE,QAAQ;CAItB,UAAU,EAAE,QAAQ;CAEpB,YAAY,EAAE,QAAQ;AACxB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,8BAA8B,EACxC,OAAO;CAEN,YAAY,EAAE,MAAM,wBAAwB;CAC5C,iBAAiB,EAAE,QAAQ;AAC7B,CAAC,CAAC,CACD,OAAO;;;;;AAOV,MAAa,qCAAqC,EAC/C,OAAO;CACN,GAAG,4BAA4B;CAC/B,aAAa,EAAE,OAAO;CAGtB,mBAAmB,EAAE,OAAO,CAAC,CAAC,SAAS;AACzC,CAAC,CAAC,CACD,OAAO;AAGV,MAAM,+BAA+B;CAKnC,YAAY,EAAE,OAAO,wBAAwB,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS;CAInE,iBAAiB,EAAE,QAAQ,CAAC,CAAC,SAAS;AACxC;AAEA,MAAa,iCAAiC,EAC3C,OAAO,EACN,QAAQ,gBACV,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,oCAAoC,EAC9C,OAAO;CACN,QAAQ;CACR,GAAG;AACL,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,wCAAwC,EAClD,OAAO;CACN,OAAO;CACP,QAAQ;AACV,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,2CAA2C,EACrD,OAAO;CACN,OAAO;CACP,QAAQ;CACR,GAAG;AACL,CAAC,CAAC,CACD,OAAO;;;ACxFV,MAAa,2BAA2B;CACtC,KAAK,GACF,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,mBAAmB;CAC5B,CAAC,CAAC,CACD,MAAM,8BAA8B,CAAC,CACrC,OAAO,2BAA2B;CACrC,QAAQ,GACL,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,mBAAmB;CAC5B,CAAC,CAAC,CACD,MAAM,iCAAiC,CAAC,CACxC,OAAO,2BAA2B;CAGrC,YAAY,GACT,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,mBAAmB;CAC5B,CAAC,CAAC,CACD,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,qCAAqC,CAAC,CAC5C,OAAO,kCAAkC;CAC5C,eAAe,GACZ,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,mBAAmB;CAC5B,CAAC,CAAC,CACD,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,wCAAwC,CAAC,CAC/C,OAAO,kCAAkC;AAC9C;;;ACnDA,MAAa,wBAAwB,EAAE,KAAK,kBAAkB;AAG9D,MAAa,iCAAiC,EAC3C,OAAO,EACN,YAAY,sBACd,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,kCAAkC,EAAE,OAAO;CACtD,YAAY;CACZ,SAAS,EAAE,QAAQ;AACrB,CAAC;;;ACVD,MAAa,wBAAwB,EACnC,QAAQ,GACL,MAAM;CACL,QAAQ;CACR,MAAM;CACN,SAAS;CACT,MAAM,CAAC,gBAAgB;AACzB,CAAC,CAAC,CACD,MAAM,8BAA8B,CAAC,CACrC,OAAO,+BAA+B,EAC3C;;;ACLA,MAAM,uBAAuB,mBAC3B,6BACA,2BACF;AAEA,MAAa,mBAAmB;CAC9B,QAAQ,GACL,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,yBAAyB,CAAC,CAChC,OAAO,0BAA0B;CACpC,WAAW,EACT,YAAY,GACT,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB,EAChC;CACA,sBAAsB,EACpB,YAAY,GACT,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB,EAChC;CACA,gBAAgB;EAGd,YAAY,GACT,MAAM;GACL,QAAQ;GACR,MAAM;GACN,SAAS;GACT,MAAM,CAAC,WAAW;EACpB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB;;;;;;;;EAQ9B,oBAAoB,GACjB,MAAM;GACL,QAAQ;GACR,MAAM;GACN,SAAS;GACT,MAAM,CAAC,WAAW;EACpB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB;CAChC;CACA,kBAAkB,EAChB,YAAY,GACT,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB,EAChC;CACA,mBAAmB,EAIjB,YAAY,GACT,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB,EAChC;CACA,cAAc,EACZ,wBAAwB,GACrB,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,yCAAyC,CAAC,CAChD,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB,EAChC;CACA,gBAAgB,EACd,wBAAwB,GACrB,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,uCAAuC,CAAC,CAC9C,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB,EAChC;AACF;;;AClIA,MAAa,0BAA0B;;AAGvC,MAAa,0BAA0B,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,uBAAuB;;AAI1F,MAAa,+BAA+B,EACzC,OAAO,EACN,QAAQ,wBAAwB,SAAS,EAC3C,CAAC,CAAC,CACD,OAAO;;AAIV,MAAa,0BAA0B,EACpC,OAAO,EACN,QAAQ,wBAAwB,SAAS,EAC3C,CAAC,CAAC,CACD,OAAO;;;AClBV,MAAa,sBAAsB;CACjC,KAAK,GACF,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACD,OAAO,uBAAuB;CACjC,QAAQ,GACL,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACD,MAAM,4BAA4B,CAAC,CACnC,OAAO,uBAAuB;AACnC;;;ACnBA,MAAa,sBAAsB,EAChC,OAAO;;CAEN,UAAU,EAAE,OAAO;;CAEnB,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS;CAChC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;CAC1B,yBAAyB,EAAE,MAAM,EAAE,OAAO,CAAC;CAC3C,WAAW,EAAE,KAAK,CAAC,CAAC,SAAS;CAC7B,WAAW,EAAE,KAAK,CAAC,CAAC,SAAS;;;;;;CAM7B,kBAAkB,EAAE,KAAK,CAAC,CAAC,SAAS;AACtC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,gCAAgC,EAAE,MAAM,mBAAmB;AAExE,MAAa,iCAAiC,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO;AAG/F,MAAa,kCAAkC,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO;;;ACpBzF,MAAa,wBAAwB;CACnC,MAAM,GACH,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,iBAAiB;CAC1B,CAAC,CAAC,CACD,OAAO,6BAA6B;CACvC,QAAQ,GACL,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,iBAAiB;CAC1B,CAAC,CAAC,CACD,MAAM,8BAA8B,CAAC,CACrC,OAAO,+BAA+B;AAC3C;;;ACjBA,MAAa,4BAA4B,EACtC,OAAO,CAAC,CACR,IAAI,CAAC,CACL,IAAI,yBAAyB,CAAC,CAC9B,IAAI,yBAAyB;AAEhC,MAAa,uBAAuB,EAAE,OAAO;CAC3C,IAAI,EAAE,OAAO;CACb,YAAY,EAAE,OAAO;CACrB,MAAM,EAAE,OAAO;CACf,QAAQ;CACR,UAAU,EAAE,OAAO;CACnB,WAAW,EAAE,QAAQ;CACrB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,MAAM,EAAE,QAAQ;CAChB,WAAW,EAAE,OAAO,KAAK;CACzB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC;AAGD,MAAa,iCAAiC,EAC3C,OAAO;CACN,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;CACtB,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,QAAQ;AACV,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO;CACN,mBAAmB,wBAAwB,SAAS;CACpD,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;CACjC,QAAQ,2BAA2B,SAAS;CAC5C,OAAO,0BAA0B,SAAS,CAAC,CAAC,SAAS;CACrD,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS;AAC7B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,kCAAkC,EAAE,OAAO;CACtD,YAAY,EAAE,KAAK;CACnB,MAAM;AACR,CAAC;AAGD,MAAa,mCAAmC,EAAE,OAAO;CACvD,OAAO;CACP,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,kCAAkC,EAAE,OAAO;CACtD,kBAAkB,EAAE,KAAK;CACzB,MAAM;AACR,CAAC;AAGD,MAAa,mCAAmC,EAAE,OAAO;CACvD,OAAO;CACP,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,kCAAkC,EAAE,OAAO,EACtD,kBAAkB,EAAE,KAAK,EAC3B,CAAC;AAGD,MAAa,mCAAmC;AAGhD,MAAa,mCAAmC,EAAE,OAAO;CACvD,YAAY,EAAE,KAAK;CACnB,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;AACvB,CAAC;AAGD,MAAa,oCAAoC,EAAE,OAAO,EACxD,MAAM,EAAE,OAAO,EACjB,CAAC;;;ACpFD,MAAa,yBAAyB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC;AAEtE,MAAa,oBAAoB,EAAE,OAAO;CACxC,IAAI,EAAE,OAAO;CACb,YAAY,EAAE,OAAO;CACrB,OAAO;CACP,UAAU,EAAE,OAAO;CACnB,WAAW,EAAE,OAAO,KAAK;CACzB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC;AAGD,MAAa,8BAA8B,EACxC,OAAO;CACN,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;CACtB,OAAO,uBAAuB,SAAS;AACzC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,8BAA8B,EACxC,OAAO;CACN,OAAO,uBAAuB,SAAS;CACvC,mBAAmB,wBAAwB,SAAS;AACtD,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,+BAA+B,EAAE,OAAO;CACnD,YAAY,EAAE,KAAK;CACnB,MAAM;AACR,CAAC;AAGD,MAAa,gCAAgC,EAAE,OAAO;CACpD,MAAM;CACN,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,oCAAoC;AAEjD,MAAa,mCAAmC,EAC7C,OAAO;CACN,YAAY,EAAE,KAAK;CACnB,MAAM,EAAE,MAAM,2BAA2B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,EAAqC;AACzF,CAAC,CAAC,CACD,aAAa,OAAO,QAAQ;CAC3B,MAAM,0BAAU,IAAI,IAAY;CAEhC,MAAM,KAAK,SAAS,KAAK,UAAU;EACjC,IAAI,IAAI,OAAO,KAAA,GACb;EAGF,IAAI,QAAQ,IAAI,IAAI,EAAE,GAAG;GACvB,IAAI,SAAS;IACX,MAAM;IACN,SAAS,qBAAqB,IAAI,GAAG;IACrC,MAAM;KAAC;KAAQ;KAAO;IAAI;GAC5B,CAAC;GACD;EACF;EAEA,QAAQ,IAAI,IAAI,EAAE;CACpB,CAAC;AACH,CAAC;AAGH,MAAa,oCAAoC,EAAE,OAAO;CACxD,OAAO,EAAE,MAAM,iBAAiB;CAChC,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,+BAA+B,EAAE,OAAO;CACnD,eAAe,EAAE,KAAK;CACtB,MAAM;AACR,CAAC;AAGD,MAAa,gCAAgC,EAAE,OAAO;CACpD,IAAI,EAAE,KAAK;CACX,YAAY,EAAE,KAAK;CACnB,OAAO;CACP,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI;CACzB,WAAW,EAAE,KAAK;CAClB,WAAW,EAAE,KAAK;CAClB,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,oCAAoC;AAEjD,MAAa,mCAAmC,EAC7C,OAAO;CACN,YAAY,EAAE,KAAK;CACnB,MAAM,EACH,MACC,EAAE,OAAO;EACP,IAAI,EAAE,KAAK;EACX,MAAM;CACR,CAAC,CACH,CAAC,CACA,IAAI,CAAC,CAAC,CACN,IAAA,EAAqC;AAC1C,CAAC,CAAC,CACD,aAAa,OAAO,QAAQ;CAC3B,MAAM,0BAAU,IAAI,IAAY;CAChC,MAAM,KAAK,SAAS,KAAK,UAAU;EACjC,IAAI,QAAQ,IAAI,IAAI,EAAE,GACpB,IAAI,SAAS;GACX,MAAM;GACN,SAAS,qBAAqB,IAAI,GAAG;GACrC,MAAM;IAAC;IAAQ;IAAO;GAAI;EAC5B,CAAC;EAEH,QAAQ,IAAI,IAAI,EAAE;CACpB,CAAC;AACH,CAAC;AAGH,MAAa,oCAAoC,EAAE,OAAO;CACxD,OAAO,EAAE,MAAM,iBAAiB;CAChC,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,+BAA+B,EAAE,OAAO,EACnD,eAAe,EAAE,KAAK,EACxB,CAAC;AAGD,MAAa,gCAAgC;AAG7C,MAAa,oCAAoC;AAEjD,MAAa,mCAAmC,EAC7C,OAAO,EACN,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,EAAqC,EACrE,CAAC,CAAC,CACD,aAAa,OAAO,QAAQ;CAC3B,MAAM,0BAAU,IAAI,IAAY;CAChC,MAAM,IAAI,SAAS,IAAI,UAAU;EAC/B,IAAI,QAAQ,IAAI,EAAE,GAChB,IAAI,SAAS;GACX,MAAM;GACN,SAAS,qBAAqB,GAAG;GACjC,MAAM,CAAC,OAAO,KAAK;EACrB,CAAC;EAEH,QAAQ,IAAI,EAAE;CAChB,CAAC;AACH,CAAC;AAGH,MAAa,oCAAoC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;AAGpF,MAAa,gCAAgC,EAAE,OAAO;CACpD,YAAY,EAAE,KAAK;CACnB,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;AACvB,CAAC;AAGD,MAAa,iCAAiC,EAAE,OAAO,EACrD,MAAM,EAAE,OAAO,EACjB,CAAC;AAGD,MAAa,6BAA6B,EACvC,OAAO;CACN,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS;CAI9B,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS;CAClD,GAAG;AACL,CAAC,CAAC,CAKD,QAAQ,UAAU,MAAM,UAAU,KAAA,KAAa,MAAM,eAAe,KAAA,GAAW;CAC9E,OAAO;CACP,MAAM,CAAC,YAAY;AACrB,CAAC;AAEH,MAAa,8BAA8B,WAAW,iBAAiB;AACvE,MAAa,4BAA4B,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAClE,MAAa,6BAA6B;;;ACjM1C,MAAa,yBAAyB,EAAE,KAAK;CAAC;CAAS;CAAU;AAAS,CAAC;AAG3E,MAAa,2BAA2B,EACrC,OAAO;CACN,sBAAsB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CAChE,uBAAuB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CACpD,yBAAyB,EAAE,OAAO,CAAC,CAAC,SAAS;AAC/C,CAAC,CAAC,CACD,SAAS,EAAE,QAAQ,CAAC;AAGvB,MAAa,2BAA2B,EACrC,OAAO;CACN,kBAAkB,EAAE,OAAO;CAC3B,UAAU,EAAE,OAAO;CACnB,OAAO,EAAE,QAAQ;AACnB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,4BAA4B,EAAE,MAAM,wBAAwB;AAEzE,MAAa,yBAAyB,EACnC,OAAO;CACN,kBAAkB,EAAE,OAAO;CAC3B,WAAW,EAAE,KAAK,CAAC,OAAO,MAAM,CAAC;AACnC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,0BAA0B,EAAE,MAAM,sBAAsB;AAErE,MAAa,+BAA+B,EACzC,OAAO;CACN,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;CACtB,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,MAAM;CACN,QAAQ,yBAAyB,SAAS;CAC1C,SAAS,0BAA0B,SAAS;CAC5C,OAAO,wBAAwB,SAAS;AAC1C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,+BAA+B,EACzC,OAAO;CACN,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;CACjC,MAAM,uBAAuB,SAAS;CACtC,QAAQ,yBAAyB,SAAS;CAC1C,SAAS,0BAA0B,SAAS;CAC5C,OAAO,wBAAwB,SAAS;AAC1C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,qBAAqB,EAAE,OAAO;CACzC,IAAI,EAAE,OAAO;CACb,YAAY,EAAE,OAAO;CACrB,MAAM,EAAE,OAAO;CACf,MAAM;CACN,QAAQ,yBAAyB,SAAS;CAC1C,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS;CACvC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS;CACrC,UAAU,EAAE,OAAO;CACnB,WAAW,EAAE,OAAO,KAAK;CACzB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC;;;ACzDD,MAAa,0BAA0B,EAAE,OAAO,CAAC,CAAC;AAGlD,MAAa,wBAAwB,EAAE,OAAO;CAC5C,IAAI,EAAE,OAAO;CACb,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,yBAAyB;AAGtC,MAAa,2BAA2B,EAAE,MAAM,sBAAsB;AAGtE,MAAa,iBAAiB,EAAE,OAAO;CACrC,IAAI,EAAE,OAAO;CACb,QAAQ,EAAE,OAAO;CACjB,MAAM,EAAE,OAAO;CACf,cAAc,sBAAsB;CACpC,kBAAkB,sBAAsB;CACxC,qBAAqB,sBAAsB;CAC3C,oBAAoB,sBAAsB;CAC1C,oBAAoB,sBAAsB;CAC1C,kBAAkB,sBAAsB;CACxC,oBAAoB,sBAAsB;CAC1C,mBAAmB,sBAAsB;CACzC,eAAe,sBAAsB;CACrC,YAAY,iBAAiB,SAAS;CAEtC,iBAAiB;CAEjB,eAAe,EAAE,KAAK,CAAC,CAAC,SAAS;CACjC,WAAW,EAAE,KAAK;CAClB,WAAW,EAAE,KAAK;AACpB,CAAC;AAGD,MAAM,2BAA2B,EAC9B,OAAO;CACN,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;CACtB,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC;AACzC,CAAC,CAAC,CACD,OAAO;AAEV,MAAa,2BAA2B,EACrC,OAAO;CACN,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;CACtB,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,SAAS,EACN,OAAO;EACN,gBAAgB,EACb,MACC,EACG,OAAO;GACN,IAAI,EAAE,KAAK;GACX,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;GACtB,QAAQ;EACV,CAAC,CAAC,CACD,OAAO,CACZ,CAAC,CACA,IAAI,CAAC;EACR,YAAY,yBAAyB,SAAS;EAC9C,aAAa,EACV,MAAM,wBAAwB,CAAC,CAC/B,IAAI,CAAC,CAAC,CACN,IAAA,EAAqC,CAAC,CACtC,SAAS;CACd,CAAC,CAAC,CACD,OAAO,CAAC,CACR,aAAa,SAAS,QAAQ;EAC7B,IAAI,QAAQ,cAAc,QAAQ,aAChC,IAAI,SAAS;GACX,MAAM;GACN,SAAS;GACT,MAAM,CAAC,aAAa;EACtB,CAAC;EAGH,IAAI,CAAC,QAAQ,aACX;EAGF,MAAM,0BAAU,IAAI,IAAY;EAChC,QAAQ,YAAY,SAAS,KAAK,UAAU;GAC1C,IAAI,IAAI,OAAO,KAAA,GACb;GAGF,IAAI,QAAQ,IAAI,IAAI,EAAE,GAAG;IACvB,IAAI,SAAS;KACX,MAAM;KACN,SAAS,qBAAqB,IAAI,GAAG;KACrC,MAAM;MAAC;MAAe;MAAO;KAAI;IACnC,CAAC;IACD;GACF;GAEA,QAAQ,IAAI,IAAI,EAAE;EACpB,CAAC;CACH,CAAC,CAAC,CACD,SAAS;AACd,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,4BAA4B;AAGzC,MAAa,6BAA6B,EAAE,OAAO;CACjD,UAAU;CACV,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,2BAA2B,EACrC,OAAO;CACN,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;CACjC,cAAc,sBAAsB,UAAU,SAAS;CACvD,kBAAkB,sBAAsB,cAAc,SAAS;CAC/D,qBAAqB,sBAAsB,iBAAiB,SAAS;AACvE,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,4BAA4B,yBAAyB,OAAO,EACvE,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,6BAA6B,EAAE,OAAO;CACjD,UAAU;CACV,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,8BAA8B,EACxC,OAAO;CACN,IAAI,EAAE,KAAK;CACX,SAAS,EAAE,QAAQ;AACrB,CAAC,CAAC,CACD,OAAO;AAIV,MAAa,+BAA+B,EAAE,OAAO,EACnD,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,EAC5B,CAAC;AAGD,MAAa,4BAA4B,EAAE,OAAO,EAChD,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,6BAA6B;AAI1C,MAAa,yBAAyB,EAAE,OAAO,EAC7C,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,gCAAgC,EAAE,OAAO,EACpD,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,iCAAiC,sBAAsB,OAAO;CACzE,cAAc,sBAAsB;CACpC,kBAAkB,sBAAsB;CACxC,qBAAqB,sBAAsB;CAC3C,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY;AAC1C,CAAC;AAGD,MAAa,+BAA+B,EAAE,OAAO,EACnD,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,0BAA0B,eAAe,OAAO;CAC3D,WAAW,EAAE,OAAO,KAAK;CACzB,WAAW,EAAE,OAAO,KAAK;CACzB,iBAAiB,EAAE,MAAM,oBAAoB;CAC7C,cAAc,EAAE,MAAM,iBAAiB;CACvC,eAAe,EAAE,MAAM,kBAAkB;AAC3C,CAAC;AAGD,MAAa,gCAAgC,EAAE,OAAO;CACpD,IAAI,EAAE,OAAO;CACb,MAAM,EAAE,OAAO;CACf,WAAW,EAAE,OAAO,KAAK;CACzB,iBAAiB,EAAE,MAAM,oBAAoB;AAC/C,CAAC;;;AC1LD,MAAa,mBAAmB;CAC9B,MAAM,qBAAqB;EACzB,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACb,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACC,MAAM,uBAAuB,CAAC,CAC9B,OAAO,wBAAwB;CAElC,YAAY,qBAAqB;EAC/B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CAExC,KAAK,GACF,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,sBAAsB,CAAC,CAC7B,OAAO,uBAAuB;CAEjC,WAAW,qBAAqB;EAC9B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,4BAA4B,CAAC,CACnC,OAAO,6BAA6B;CAEvC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACC,OAAO,mBAAmB,uBAAuB,wBAAwB,CAAC,CAAC,CAC3E,OAAO,mBAAmB,yBAAyB,CAAC,CAAC,CACrD,MAAM,yBAAyB,CAAC,CAChC,OAAO,0BAA0B;CAEpC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,yBAAyB,CAAC,CAChC,OAAO,0BAA0B;CAEpC,UAAU,qBAAqB;EAC7B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,2BAA2B,CAAC,CAClC,OAAO,4BAA4B;CAEtC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,yBAAyB,CAAC,CAChC,OAAO,0BAA0B;AACtC;;;ACtGA,MAAa,yBAAyB;CACpC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,kBAAkB;CAC3B,CAAC,CAAC,CACC,OAAO,mBAAmB,sBAAsB,8BAA8B,CAAC,CAAC,CAChF,OAAO,mBAAmB,yBAAyB,CAAC,CAAC,CACrD,MAAM,+BAA+B,CAAC,CACtC,OAAO,gCAAgC;CAE1C,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,kBAAkB;CAC3B,CAAC,CAAC,CACC,OAAO,mBAAmB,2BAA2B,CAAC,CAAC,CACvD,OAAO,mBAAmB,4BAA4B,+BAA+B,CAAC,CAAC,CACvF,MAAM,+BAA+B,CAAC,CACtC,OAAO,gCAAgC;CAE1C,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,kBAAkB;CAC3B,CAAC,CAAC,CACC,OACC,mBACE,6BACA,8CACA,wCACA,8BACF,CACF,CAAC,CACA,MAAM,+BAA+B,CAAC,CACtC,OAAO,gCAAgC;CAE1C,SAAS,GACN,OAAO,mBAAmB,sBAAsB,8BAA8B,CAAC,CAAC,CAChF,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,kBAAkB;CAC3B,CAAC,CAAC,CACD,MAAM,gCAAgC,CAAC,CACvC,OAAO,iCAAiC;AAC7C;;;AC5CA,MAAa,sBAAsB;CACjC,MAAM,qBAAqB;EACzB,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,0BAA0B,CAAC,CACjC,OAAO,2BAA2B;CACrC,KAAK,qBAAqB;EACxB,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OAAO,mBAAmB,wBAAwB,CAAC,CAAC,CACpD,MAAM,yBAAyB,CAAC,CAChC,OAAO,0BAA0B;CACpC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OACC,mBACE,sBACA,0BACA,gCACA,qBACF,CACF,CAAC,CACA,OAAO,mBAAmB,yBAAyB,CAAC,CAAC,CACrD,MAAM,4BAA4B,CAAC,CACnC,OAAO,6BAA6B;CAEvC,YAAY,qBAAqB;EAC/B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OACC,mBACE,sBACA,0BACA,gCACA,qBACF,CACF,CAAC,CACA,OAAO,mBAAmB,yBAAyB,CAAC,CAAC,CACrD,MAAM,gCAAgC,CAAC,CACvC,OAAO,iCAAiC;CAE3C,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OAAO,mBAAmB,0BAA0B,wBAAwB,CAAC,CAAC,CAC9E,OAAO,mBAAmB,0BAA0B,CAAC,CAAC,CACtD,MAAM,4BAA4B,CAAC,CACnC,OAAO,6BAA6B;CAEvC,YAAY,qBAAqB;EAC/B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OACC,mBAAmB,sBAAsB,0BAA0B,wBAAwB,CAC7F,CAAC,CACA,OAAO,mBAAmB,0BAA0B,CAAC,CAAC,CACtD,MAAM,gCAAgC,CAAC,CACvC,OAAO,iCAAiC;CAE3C,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OAAO,mBAAmB,0BAA0B,8BAA8B,CAAC,CAAC,CACpF,MAAM,4BAA4B,CAAC,CACnC,OAAO,6BAA6B;CAEvC,YAAY,qBAAqB;EAC/B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OAAO,mBAAmB,0BAA0B,8BAA8B,CAAC,CAAC,CACpF,MAAM,gCAAgC,CAAC,CACvC,OAAO,iCAAiC;CAE3C,SAAS,GACN,OAAO,mBAAmB,sBAAsB,8BAA8B,CAAC,CAAC,CAChF,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;AAC1C;;;;AC/IA,MAAa,yBAAyB;;;;;;AAOtC,MAAa,8BAA8B;CACzC,MAAM;CACN,KAAK;CACL,OAAO;AACT;;AAGA,MAAa,wBAAwB,EAClC,OAAO,CAAC,CACR,IAAI,GAAG,CAAC,CACR,MAAM,kDAAkD;AAG3D,MAAa,kBAAkB;AAC/B,MAAa,kBAAkB;;AAG/B,MAAa,mBAAmB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAA,GAAmB,CAAC,CAAC,IAAA,GAAmB;;;;;;AAOzF,MAAa,0BAA0B,EACpC,OAAO;CACN,gBAAgB,EAAE,cAAc,uBAAuB,qBAAqB;CAE5E,mBAAmB,sBAAsB,SAAS;CAClD,MAAM;AACR,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,6BAAgD;CAC3D,gBAAgB,CAAC;CACjB,mBAAmB;CACnB,MAAM;AACR;;;;;AAMA,MAAa,qCAAqC,EAC/C,OAAO;CACN,gBAAgB,EACb,cAAc,uBAAuB,sBAAsB,SAAS,CAAC,CAAC,CACtE,SAAS;CACZ,mBAAmB,sBAAsB,SAAS,CAAC,CAAC,SAAS;CAC7D,MAAM,iBAAiB,SAAS;AAClC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,0BAA0B,EAAE,KAAK;CAAC;CAAU;CAAQ;AAAS,CAAC;AAG3E,MAAa,oBAAoB,EAC9B,OAAO;CACN,MAAM;CAEN,aAAa,EAAE,OAAO;CACtB,QAAQ,EAAE,OAAO;CAEjB,UAAU,sBAAsB,SAAS;CACzC,QAAQ;CAER,cAAc,EAAE,QAAQ;AAC1B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,2BAA2B,EACrC,OAAO;CACN,QAAQ,EAAE,MAAM,iBAAiB;CAEjC,eAAe,EAAE,cAAc,uBAAuB,qBAAqB;CAC3E,0BAA0B;AAC5B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,8BAA8B,EACxC,OAAO;CACN,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,GAA0B;CAGzD,UAAU,sBAAsB,SAAS;CAGzC,OAAO,sBAAsB,SAAS;AACxC,CAAC,CAAC,CACD,OAAO;;;;;AAOV,MAAa,+BAA+B,EACzC,OAAO;CACN,KAAK,EAAE,IAAI;CACX,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC,CAAC,CACD,OAAO;;;AC/GV,MAAa,iBAAiB;CAC5B,gBAAgB,GACb,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,OAAO,uBAAuB;CACjC,mBAAmB,GAChB,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,kCAAkC,CAAC,CACzC,OAAO,uBAAuB;CACjC,YAAY,GACT,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,OAAO,wBAAwB;CAClC,YAAY,GACT,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,2BAA2B,CAAC,CAClC,OAAO,4BAA4B;AACxC;;;ACnCA,MAAM,qCAAqB,IAAI,IAAiC;AAIhE,SAAS,WAAW,UAAkB;CACpC,OAAO,SAAS,QAAQ,WAAW,WAAW,OAAO,YAAY,CAAC;AACpE;AAEA,SAAS,qBAAqB,UAAuC;CACnE,MAAM,MAAM,WAAW,QAAQ;CAC/B,MAAM,SAAS,mBAAmB,IAAI,GAAG;CACzC,IAAI,QACF,OAAO;CAGT,MAAM,YAAY,IAAI,KAAK,eAAe,SAAS,EAAE,UAAU,SAAS,CAAC;CACzE,MAAM,YAAY,UAAU,gBAAgB,CAAC,CAAC;CAC9C,IAAI,UAAU,WAAW,GAAG,KAAK,UAAU,WAAW,GAAG,GACvD,OAAO;CAGT,MAAM,eAAe,WAAW,SAAS;CACzC,MAAM,SAAS,mBAAmB,IAAI,YAAY,KAAK;CACvD,mBAAmB,IAAI,cAAc,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM;CAC5D,OAAO;AACT;AAEA,MAAa,iBAAiB,EAC3B,OAAO,CAAC,CACR,KAAK,CAAC,CACN,IAAI,CAAC,CAAC,CACN,QAAQ,aAAa;CACpB,IAAI;EACF,qBAAqB,QAAQ,CAAC,CAAC,uBAAO,IAAI,KAAK,CAAC;EAChD,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF,GAAG,kBAAkB;;;;;;;;AAUvB,MAAa,0BAA0B,eAAe,WAAW,UAAU,QAAQ;CACjF,MAAM,OAAO,kBAAkB,QAAQ;CACvC,IAAI,CAAC,MAAM;EACT,IAAI,SAAS;GACX,MAAM;GACN,SACE;EACJ,CAAC;EACD,OAAO,EAAE;CACX;CACA,OAAO;AACT,CAAC;;;AC9CD,MAAa,aAAa;AAG1B,MAAa,iCAAiC;AAC9C,MAAM,8BAA8B;AACpC,MAAM,6BAA6B;AAOnC,eAAsB,wBAAwB,MAA6B;CACzE,OAAO,OACL,GAAG,4BAA4B,GAAG,KAAK,GAAG,GAAG,qBAAqB,KAAK,cAAc,KACrF,8BACF;AACF;AAEA,MAAa,uBAAuB,EACjC,OAAO;CACN,QAAQ,EAAE,KAAK;CACf,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;CACtB,QAAQ;CACR,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,0BAA0B;CAClE,UAAU;AACZ,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,+BAA+B,EACzC,OAAO;CACN,kBAAkB,EAAE,KAAK,CAAC,CAAC,SAAS;CACpC,QAAQ,EAAE,KAAK;AACjB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,+BAA+B,EAAE,OAC5C,4BACA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CACxB;AAGA,MAAa,oCAAoC,EAC9C,OAAO;CACN,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS;CACxC,UAAU;AACZ,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,qCAAqC,EAAE,OAAO,EAAE,KAAK,GAAG,4BAA4B;AAGjG,MAAa,kDAAkD,EAC5D,OAAO,EACN,UAAU,wBACZ,CAAC,CAAC,CACD,OAAO;;AAMV,MAAa,mDAAmD,EAC7D,OAAO;CACN,UAAU;CACV,OAAO;AACT,CAAC,CAAC,CACD,SAAS;AAKZ,MAAa,iCAAiC,EAC3C,OAAO;CACN,QAAQ,EAAE,KAAK;CACf,SAAS,EAAE,QAAQ;AACrB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,8BAA8B;AAG3C,MAAa,iCAAiC;AAG9C,MAAa,kBAAkB,EAAE,OAAO;CACtC,IAAI,EAAE,KAAK;CACX,YAAY,EAAE,KAAK;CACnB,QAAQ,EAAE,KAAK;CACf,QAAQ;CACR,OAAOA;CACP,WAAW,EAAE,OAAO;CACpB,qBAAqBC;CACrB,kBAAkB;CAClB,iBAAiB,EAAE,OAAO,CAAC,CAAC,YAAY;CACxC,sBAAsB,EAAE,OAAO,CAAC,CAAC,YAAY;CAC7C,YAAY,EAAE,OAAO,KAAK;CAC1B,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI;CAC3B,uBAAuB;CACvB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC;AAGD,MAAa,iCAAiC,gBAAgB,KAAK,EACjE,uBAAuB,KACzB,CAAC;AAGD,MAAa,gCAAgC,EAC1C,OAAO;CACN,GAAG;CACH,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS;CAC9B,QAAQ,EAAE,KAAK,CAAC,CAAC,SAAS;AAC5B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO;CACN,OAAO,EAAE,MAAM,8BAA8B;CAC7C,SAAS,EAAE,QAAQ;AACrB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,wBAAwB,EAAE,OAAO;CAC5C,MAAM;CACN,QAAQ;CACR,MAAM,EAAE,OAAO;CAEf,SAAS,EAAE,QAAQ;AACrB,CAAC;AAGD,MAAa,gCAAgC,EAAE,OAAO;CACpD,MAAM;CACN,oBAAoB,EAAE,KAAK;CAC3B,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,sBAAsB,EAAE,OAAO,EAC1C,MAAM,EAAE,OAAO,EACjB,CAAC;AAGD,MAAa,+BAA+B;AAG5C,MAAa,kCAAkC;AAG/C,MAAa,2CAA2C,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;AAE5E,MAAa,iCAAiC,EAC3C,OAAO;CACN,OAAO,EAAE,KAAK;CACd,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CAC9B,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS;CACvC,aAAa,EAAE,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS;AACjD,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,4CAA4C,EAAE,MAAM,8BAA8B;AAK/F,MAAa,4CAA4C,EACtD,OAAO,EACN,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EACjC,CAAC,CAAC,CACD,OAAO;AAKV,MAAa,6CAA6C,EACvD,OAAO,EACN,mBAAmB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAClD,CAAC,CAAC,CACD,OAAO;AAKV,SAAS,qBAAqB,gBAAsC;CAClE,OAAO,iBAAiB,IAAI,KAAK,cAAc,CAAC,CAAC,YAAY,IAAI;AACnE;AAEA,eAAe,OAAO,MAAc,WAAmB;CACrD,MAAM,iBAAiB,YAAY,SAAS;CAC5C,MAAM,YAAY,IAAI,YAAY,CAAC,CAAC,OAAO,IAAI;CAC/C,MAAM,QAAQ,IAAI,WAAW,eAAe,SAAS,UAAU,MAAM;CACrE,MAAM,IAAI,cAAc;CACxB,MAAM,IAAI,WAAW,eAAe,MAAM;CAG1C,MAAM,QAAQ,IADG,WAAW,MAAM,OAAO,OAAO,OAAO,SAAS,KAAK,CACpD,CAAC,CAAC,MAAM,GAAG,EAAE;CAC9B,MAAM,cAAc,MAAM;CAC1B,MAAM,cAAc,MAAM;CAC1B,IAAI,gBAAgB,KAAA,KAAa,gBAAgB,KAAA,GAC/C,MAAM,IAAI,MAAM,4BAA4B;CAE9C,MAAM,KAAM,cAAc,KAAQ;CAClC,MAAM,KAAM,cAAc,KAAQ;CAElC,OAAO,YAAY,KAAK;AAC1B;AAEA,SAAS,YAAY,MAAc;CACjC,MAAM,MAAM,KAAK,WAAW,KAAK,EAAE,CAAC,CAAC,YAAY;;CAEjD,IAAI,CAAC,iBAAiB,KAAK,GAAG,GAC5B,MAAM,IAAI,MAAM,wBAAwB;CAG1C,OAAO,IAAI,WACT,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,UAC7B,OAAO,SAAS,IAAI,MAAM,QAAQ,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,CACzD,CACF;AACF;AAEA,SAAS,YAAY,OAAmB;CACtC,MAAM,MAAM,MAAM,KAAK,QAAQ,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC;CAC1E,OAAO;EACL,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;EACvB,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;EACvB,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;EACvB,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE;EACxB,IAAI,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE;CAC3B,CAAC,CAAC,KAAK,GAAG;AACZ;;;AC5OA,MAAa,cAAc;CACzB,qBAAqB,qBAAqB;EACxC,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,iCAAiC,CAAC,CACxC,OAAO,kCAAkC;CAC5C,mCAAmC,GAChC,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACD,MAAM,+CAA+C,CAAC,CACtD,OAAO,gDAAgD;CAC1D,4BAA4B,GACzB,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACD,MAAM,wCAAwC,CAAC,CAC/C,OAAO,yCAAyC;CAEnD,6BAA6B,GAC1B,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACD,MAAM,yCAAyC,CAAC,CAChD,OAAO,0CAA0C;CAEpD,iBAAiB,qBAAqB;EACpC,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACC,OAAO,mBAAmB,kBAAkB,oBAAoB,CAAC,CAAC,CAClE,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CAExC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACC,OAAO,mBAAmB,kBAAkB,uBAAuB,yBAAyB,CAAC,CAAC,CAC9F,MAAM,oBAAoB,CAAC,CAC3B,OAAO,qBAAqB;CAC/B,gBAAgB,qBAAqB;EACnC,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACC,OACC,mBACE,kBACA,oCACA,yBACF,CACF,CAAC,CACA,MAAM,4BAA4B,CAAC,CACnC,OAAO,6BAA6B;CACvC,eAAe,qBAAqB;EAClC,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACC,OACC,mBACE,kBACA,uBACA,mBACA,gCACF,CACF,CAAC,CACA,MAAM,2BAA2B,CAAC,CAClC,OAAO,4BAA4B;CACtC,kBAAkB,qBAAqB;EACrC,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACC,OACC,mBACE,kBACA,0BACA,sBACA,gCACF,CACF,CAAC,CACA,MAAM,8BAA8B,CAAC,CACrC,OAAO,+BAA+B;AAC3C;;;AC7IA,MAAa,kCAAkC,EAC5C,OAAO;CACN,MAAM,EAAE,IAAI,KAAK;CACjB,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY;AACtC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,oCAAoC,EAC9C,OAAO,EACN,OAAO,EAAE,MAAM,+BAA+B,EAChD,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,mCAAmC,EAC7C,OAAO;CACN,MAAM,EAAE,IAAI,KAAK;CACjB,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI;AACxB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,qCAAqC,EAC/C,OAAO;CACN,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY;CACxC,OAAO,EAAE,MAAM,gCAAgC;AACjD,CAAC,CAAC,CACD,OAAO;;;AC5BV,MAAa,6BAA6B,EACvC,OAAO;CACN,MAAM,EAAE,IAAI,KAAK;CACjB,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY;CACtC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY;AAC3C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,+BAA+B,EACzC,OAAO;CACN,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY;CAC3C,OAAO,EAAE,MAAM,0BAA0B;AAC3C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO;CACN,MAAM,EAAE,IAAI,KAAK;CACjB,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI;AACxB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,mCAAmC,EAC7C,OAAO;CACN,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY;CACxC,OAAO,EAAE,MAAM,8BAA8B;AAC/C,CAAC,CAAC,CACD,OAAO;;;AC3BV,MAAM,yBAAyB,EAC5B,MAAM,EAAE,KAAK,CAAC,CAAC,CACf,IAAI,CAAC,CAAC,CACN,WAAW,QAAQ,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAE9C,MAAa,mBAAmB,EAC7B,OAAO;CACN,aAAa,uBAAuB,SAAS;CAC7C,MAAM,EAAE,IAAI,KAAK,CAAC,CAAC,SAAS;CAC5B,IAAI,EAAE,IAAI,KAAK;CACf,UAAU;AACZ,CAAC,CAAC,CACD,OAAO,CAAC,CACR,QAAQ,UAAU,CAAC,MAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI;CACxD,SAAS;CACT,MAAM,CAAC,MAAM;AACf,CAAC;AAGH,MAAa,4BAA4B,EACtC,OAAO;CACN,KAAK;CACL,UAAU;AACZ,CAAC,CAAC,CACD,OAAO;;;ACvBV,MAAa,gBAAgB;CAC3B,UAAU,GACP,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,YAAY;CACrB,CAAC,CAAC,CACD,MAAM,gBAAgB,CAAC,CACvB,OAAO,yBAAyB;CAEnC,iBAAiB,GACd,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,YAAY;CACrB,CAAC,CAAC,CACD,MAAM,gBAAgB,CAAC,CACvB,OAAO,gCAAgC;CAE1C,mBAAmB,GAChB,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,YAAY;CACrB,CAAC,CAAC,CACD,MAAM,gBAAgB,CAAC,CACvB,OAAO,kCAAkC;AAC9C;;;ACnCA,MAAa,gCAAgC,EAC1C,OAAO,EACN,UAAU,eACZ,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO;CACN,UAAU;CACV,SAAS,EAAE,QAAQ;AACrB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,gCAAgC,EAC1C,OAAO,EACN,UAAU,eACZ,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO,EACN,UAAU,eACZ,CAAC,CAAC,CACD,OAAO;AAMV,MAAa,8BAA8B,EACxC,OAAO,EACN,QAAQ,gBACV,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,+BAA+B,EACzC,OAAO;CACN,QAAQ;CACR,SAAS,EAAE,QAAQ;AACrB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,8BAA8B,EACxC,OAAO,EACN,QAAQ,gBACV,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,+BAA+B,EACzC,OAAO,EACN,QAAQ,gBACV,CAAC,CAAC,CACD,OAAO;;;AClDV,MAAa,eAAe;CAC1B,gBAAgB,GACb,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CACxC,gBAAgB,GACb,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CACxC,cAAc,GACX,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACD,MAAM,2BAA2B,CAAC,CAClC,OAAO,4BAA4B;CACtC,cAAc,GACX,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACD,MAAM,2BAA2B,CAAC,CAClC,OAAO,4BAA4B;AACxC;;;AC7CA,MAAa,8BAA8B,EAAE,KAAK;CAAC;CAAW;CAAc;CAAa;AAAQ,CAAC;AAIlG,MAAa,gCAAgC,EAAE,OAAO;CACpD,IAAI,EAAE,OAAO;CACb,UAAU,EAAE,OAAO;CACnB,SAAS,EAAE,OAAO;CAClB,KAAK,EAAE,OAAO;CACd,QAAQ;CACR,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;CACjC,kBAAkB,EAAE,OAAO,CAAC,CAAC,SAAS;CACtC,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,WAAW,EAAE,KAAK;CAClB,WAAW,EAAE,KAAK;AACpB,CAAC;AAID,MAAa,iCAAiC,EAAE,OAAO;CACrD,IAAI,EAAE,OAAO;CACb,kBAAkB,EAAE,OAAO,CAAC,CAAC,SAAS;CACtC,UAAU,EAAE,MAAM,uBAAuB;AAC3C,CAAC;AAGD,MAAa,mCAAmC,EAC7C,OAAO;CACN,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,QAAQ,kBAAkB,GAAG,MAAM,MAAM,EAC5D,SAAS,oCACX,CAAC;CAMD,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS;AACzC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,gCAAgC,EAC1C,OAAO,EACN,IAAI,EAAE,KAAK,EACb,CAAC,CAAC,CACD,OAAO;AAQV,MAAa,iCAAiC,EAAE,OAAO;CACrD,IAAI,EAAE,OAAO;CACb,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI;CAC5B,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI;CAC7B,kBAAkB,EAAE,OAAO,CAAC,CAAC,IAAI;CACjC,SAAS,EAAE,IAAI,SAAS,CAAC,CAAC,SAAS;CACnC,WAAW,EAAE,IAAI,SAAS,CAAC,CAAC,SAAS;AACvC,CAAC;AAQD,MAAa,6BAA6B,EAAE,OAAO;CACjD,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI;CAC5B,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI;CAC7B,kBAAkB,EAAE,OAAO,CAAC,CAAC,IAAI;CACjC,MAAM;CACN,OAAO,EAAE,MAAM,8BAA8B;AAC/C,CAAC;;;AE5DD,MAAa,WAAW;CACtB,SAAS;CACT,MAAM;CACN,cAAc;CACd,OAAO;CACP,kBAAkB;CAClB,eAAe;CACf,UAAU;CACV,aAAa;CACb,eAAe;CACf,UAAU;CACV,gBAAgB;CAChB,aAAa;CACb,QAAQ;CACR,KAAK;CACL,OAAO;CACP,MAAM;CACN,iBAAiB;EDzBjB,QAAQ,GACL,OACC,mBACE,sCACA,6CACA,wCACA,wCACF,CACF,CAAC,CACA,MAAM;GACL,QAAQ;GACR,MAAM;GACN,SAAS;GACT,MAAM,CAAC,qBAAqB;EAC9B,CAAC,CAAC,CACD,MAAM,gCAAgC,CAAC,CACvC,OAAO,6BAA6B;EACvC,UAAU,GACP,MAAM;GACL,QAAQ;GACR,MAAM;GACN,SAAS;GACT,MAAM,CAAC,qBAAqB;EAC9B,CAAC,CAAC,CACD,OAAO,0BAA0B;EACpC,KAAK,GACF,OACC,mBAAmB,8BAA8B,2CAA2C,CAC9F,CAAC,CACA,MAAM;GACL,QAAQ;GACR,MAAM;GACN,SAAS;GACT,MAAM,CAAC,qBAAqB;EAC9B,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,6BAA6B;EACvC,cAAc,GACX,OACC,mBACE,8BACA,8BACA,2CACF,CACF,CAAC,CACA,MAAM;GACL,QAAQ;GACR,MAAM;GACN,SAAS;GACT,MAAM,CAAC,qBAAqB;EAC9B,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CC3BvB;AACnB"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["cardStateSchema","scheduleStatusSchema"],"sources":["../src/schemas/app-locale.ts","../src/schemas/billing.ts","../src/schemas/hosted-ai.ts","../src/public-errors.ts","../src/contracts/billing.ts","../src/contracts/shared.ts","../src/schemas/pagination.ts","../src/schemas/resource-mutation.ts","../src/schemas/card.ts","../src/contracts/card.ts","../src/contracts/card-template.ts","../src/schemas/ebook.ts","../src/contracts/ebook.ts","../src/schemas/email-preferences.ts","../src/contracts/email-preferences.ts","../src/schemas/feature-access.ts","../src/contracts/feature-access.ts","../src/contracts/hosted-ai.ts","../src/schemas/mastery-goal.ts","../src/contracts/mastery-goal.ts","../src/schemas/mcp-connection.ts","../src/contracts/mcp-connection.ts","../src/schemas/notebase-column.ts","../src/schemas/notebase-row.ts","../src/schemas/notebase-view.ts","../src/schemas/notebase.ts","../src/contracts/notebase.ts","../src/contracts/notebase-column.ts","../src/contracts/notebase-row.ts","../src/schemas/speech.ts","../src/contracts/speech.ts","../src/schemas/timezone.ts","../src/schemas/srs.ts","../src/contracts/srs.ts","../src/schemas/notebase-stats.ts","../src/schemas/srs-stats.ts","../src/schemas/stats.ts","../src/contracts/stats.ts","../src/schemas/user.ts","../src/contracts/user.ts","../src/schemas/video-transcript.ts","../src/contracts/video-transcript.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\";\n\n/**\n * The languages the website is in (`project.inlang/settings.json`; a test in\n * apps/www keeps the two in step). Used wherever the server writes for a\n * person: Stripe pages, emails, and the account's `locale`.\n */\nexport const appLocaleSchema = z.enum([\"en\", \"es\", \"ja\", \"ko\", \"ru\", \"tr\", \"vi\", \"zh\", \"zh-TW\"]);\nexport type AppLocale = z.infer<typeof appLocaleSchema>;\n","import type { AppLocale } from \"./app-locale\";\nimport { z } from \"zod\";\nimport { appLocaleSchema } from \"./app-locale\";\n\nexport const billingIntervalSchema = z.enum([\"month\", \"year\"]);\nexport type BillingInterval = z.infer<typeof billingIntervalSchema>;\n\nexport const billingSubscriptionStatusSchema = z.enum([\n \"incomplete\",\n \"incomplete_expired\",\n \"trialing\",\n \"active\",\n \"past_due\",\n \"canceled\",\n \"unpaid\",\n \"paused\",\n]);\nexport type BillingSubscriptionStatus = z.infer<typeof billingSubscriptionStatusSchema>;\n\nexport const billingPlanSchema = z.enum([\"free\", \"pro\", \"ultra\"]);\nexport type BillingPlan = z.infer<typeof billingPlanSchema>;\n\n/**\n * How many MCP tool calls each plan may make in a day (24 hours from the first\n * one); `null` is no limit. Each `tools/call` counts once, whatever the tool.\n *\n * Read by the MCP server's gate AND by the website's copy, so the pages cannot\n * promise calls the server refuses.\n *\n * Companion edit when this changes: the MCP docs under\n * `apps/www/content/docs/mcp/` and `account-and-plans`, which state the numbers.\n */\nexport const MCP_DAILY_CALL_LIMITS = {\n free: 10,\n pro: 50,\n ultra: null,\n} as const satisfies Record<BillingPlan, number | null>;\n\n// Plans a user can actively check out into (the free tier has no price).\nexport const billingCheckoutPlanSchema = z.enum([\"pro\", \"ultra\"]);\nexport type BillingCheckoutPlan = z.infer<typeof billingCheckoutPlanSchema>;\n\nexport const billingCurrencySchema = z.enum([\"usd\", \"cad\", \"cny\"]);\nexport type BillingCurrency = z.infer<typeof billingCurrencySchema>;\n\n// The billing name of `appLocaleSchema`, which it was before the account had a\n// locale of its own; kept so existing imports keep working.\nexport const billingLocaleSchema = appLocaleSchema;\nexport type BillingLocale = AppLocale;\n\nexport const billingAccessSourceSchema = z.enum([\"subscription\", \"pass\"]);\nexport type BillingAccessSource = z.infer<typeof billingAccessSourceSchema>;\n\nexport const billingScheduledChangeSchema = z\n .object({\n plan: billingCheckoutPlanSchema,\n interval: billingIntervalSchema,\n effectiveAt: z.coerce.date(),\n })\n .strict();\nexport type BillingScheduledChange = z.infer<typeof billingScheduledChangeSchema>;\n\n/**\n * The zone a payment deadline is shown in, as a date with no time. UTC−12 is\n * the last zone to finish a day, and `dueBy` is the end of a day there, so the\n * date it shows stays open in every customer's zone until their own midnight.\n */\nexport const BILLING_PAYMENT_DUE_TIME_ZONE = \"Etc/GMT+12\";\n\n/**\n * A renewal whose payment failed. The plan stays until `dueBy`; paying the\n * invoice before then (or later, until the subscription is canceled) restores\n * the subscription as if the payment had gone through.\n */\nexport const billingPaymentDueSchema = z\n .object({\n /** The last instant of the plan; show it in BILLING_PAYMENT_DUE_TIME_ZONE. */\n dueBy: z.coerce.date(),\n /**\n * The plan the payment keeps. Not `BillingStatus.plan`: past `dueBy` that\n * already reads \"free\" while the invoice is still payable.\n */\n plan: billingCheckoutPlanSchema,\n /** The Stripe-hosted page that pays the invoice; null if Stripe gave none. */\n url: z.url().nullable(),\n })\n .strict();\nexport type BillingPaymentDue = z.infer<typeof billingPaymentDueSchema>;\n\nexport const billingStatusSchema = z\n .object({\n plan: billingPlanSchema,\n status: billingSubscriptionStatusSchema.nullable(),\n interval: billingIntervalSchema.nullable(),\n currentPeriodEnd: z.coerce.date().nullable(),\n /**\n * When the subscription terminates, or null if it renews. Replaces the\n * `cancelAtPeriodEnd` boolean: Stripe deprecated its counterpart and the\n * Customer Portal no longer sets it, and the termination date is not always\n * `currentPeriodEnd` — a stacked pass pushes that past the cancellation.\n */\n cancelAt: z.coerce.date().nullable(),\n accessSource: billingAccessSourceSchema.nullable(),\n scheduledChange: billingScheduledChangeSchema.nullable(),\n paymentDue: billingPaymentDueSchema.nullable(),\n unlimitedNotebaseNotes: z.boolean(),\n notebaseNoteLimit: z.number().int().positive(),\n notebaseNoteCount: z.number().int().min(0),\n })\n .strict();\nexport type BillingStatus = z.infer<typeof billingStatusSchema>;\n\nexport const billingCreateCheckoutSessionInputSchema = z\n .object({\n currency: billingCurrencySchema,\n interval: billingIntervalSchema,\n locale: appLocaleSchema,\n plan: billingCheckoutPlanSchema.default(\"pro\"),\n })\n .strict();\nexport type BillingCreateCheckoutSessionInput = z.infer<\n typeof billingCreateCheckoutSessionInputSchema\n>;\n\nexport const billingCreateCustomerPortalSessionInputSchema = z\n .object({\n locale: appLocaleSchema,\n })\n .strict();\nexport type BillingCreateCustomerPortalSessionInput = z.infer<\n typeof billingCreateCustomerPortalSessionInputSchema\n>;\n\nexport const billingSessionUrlOutputSchema = z\n .object({\n url: z.url(),\n })\n .strict();\nexport type BillingSessionUrlOutput = z.infer<typeof billingSessionUrlOutputSchema>;\n\nexport const billingCancelScheduledChangeOutputSchema = z\n .object({\n success: z.literal(true),\n })\n .strict();\nexport type BillingCancelScheduledChangeOutput = z.infer<\n typeof billingCancelScheduledChangeOutputSchema\n>;\n","import { z } from \"zod\";\nimport { billingPlanSchema } from \"./billing\";\n\nexport const HostedAiOutputFieldTypeSchema = z.enum([\"string\", \"number\"]);\n\nexport const HostedAiOutputFieldSchema = z.strictObject({\n name: z.string().trim().min(1).max(80),\n type: HostedAiOutputFieldTypeSchema,\n});\n\nconst HostedAiInstructionsSchema = z.string().trim().min(1).max(16000);\n\n/**\n * Which hosted model a request runs on. Deliberately NOT named after a billing\n * plan: which plans may reach which tier is policy (see `access-policy.ts`),\n * not identity, so a future plan can be sold with any tier without a rename.\n */\nexport const HostedAiModelTierSchema = z.enum([\"normal\", \"advance\"]);\n/**\n * The billing/access subject of a hosted request, not a route id. Sub-calls\n * bill against the feature they serve: the page summary is `pageTranslation`,\n * and the video summary and subtitle segmentation are `videoSubtitles`.\n *\n * Appended last on purpose: the db pgEnum mirrors this order, and appending\n * keeps drizzle from emitting the ADD VALUE ... BEFORE variant.\n */\nexport const HostedAiFeatureSchema = z.enum([\n \"pageTranslation\",\n \"customAction\",\n \"noteSuggestion\",\n \"selectionTranslation\",\n \"videoSubtitles\",\n \"inputTranslation\",\n \"languageDetection\",\n]);\nexport const HostedAiRequestIdSchema = z.uuid();\n\nconst HostedAiRequestMetadataSchema = {\n /**\n * Optional on the wire, always present after parsing: these endpoints shipped\n * before tiers existed, so every installed extension below 1.46.0 sends no\n * `modelTier` at all, and the input objects are strict. Defaulting here keeps\n * those clients working while giving handlers a single source of truth\n * instead of a `?? \"normal\"` at every call site.\n *\n * TODO(2026-11-01): Drop the default and make this required once extensions\n * below 1.46.0 have drained from the store.\n */\n modelTier: HostedAiModelTierSchema.default(\"normal\"),\n requestId: HostedAiRequestIdSchema.optional(),\n};\n\nexport const HostedAiStreamTextInputSchema = z.strictObject({\n ...HostedAiRequestMetadataSchema,\n instructions: HostedAiInstructionsSchema,\n prompt: z.string().trim().min(1).max(32000),\n temperature: z.number().min(0).max(2).optional(),\n});\n\nexport const HostedAiStreamStructuredObjectInputSchema = z\n .strictObject({\n ...HostedAiRequestMetadataSchema,\n instructions: HostedAiInstructionsSchema,\n prompt: z.string().trim().min(1).max(32000),\n outputSchema: z.array(HostedAiOutputFieldSchema).min(1).max(32),\n temperature: z.number().min(0).max(2).optional(),\n })\n .superRefine((input, ctx) => {\n const fieldNames = new Set<string>();\n\n input.outputSchema.forEach((field, index) => {\n if (fieldNames.has(field.name)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Duplicate output schema name \"${field.name}\".`,\n path: [\"outputSchema\", index, \"name\"],\n });\n return;\n }\n\n fieldNames.add(field.name);\n });\n });\n\nexport const HOSTED_AI_NOTE_SUGGESTION_MAX_NOTES = 2;\nexport const HOSTED_AI_NOTE_SUGGESTION_MAX_NOTE_FIELDS = 16;\n\nexport const HostedAiNoteSuggestionStreamInputSchema = z.strictObject({\n ...HostedAiRequestMetadataSchema,\n instructions: HostedAiInstructionsSchema,\n prompt: z.string().trim().min(1).max(32000),\n temperature: z.number().min(0).max(2).optional(),\n});\n\n/**\n * Fixed structured-output schema for hosted note suggestions. Must stay\n * strict-structured-outputs-safe: strict objects only, no records, no\n * `.optional()` (nullable-only), unions limited to primitives. If the upstream\n * deployment rejects `maxItems`/`maxLength` constraint keywords, strip the\n * `.max()` calls from the model-facing copy only — clients still validate\n * against this schema.\n */\nexport const HostedAiNoteSuggestionObjectSchema = z.strictObject({\n action: z.strictObject({\n createNewDictionaryAction: z.boolean(),\n targetActionId: z.string().max(128).nullable(),\n /**\n * Name of the chosen schema's field whose value best works as a one-line\n * explanation of the term in UI (usually a definition/meaning field);\n * null when no field fits. Purely a display hint — clients sanitize it\n * and fall back to their own ordering when invalid.\n */\n summaryFieldName: z.string().max(80).nullable(),\n }),\n notes: z\n .array(\n z.strictObject({\n fields: z\n .array(\n z.strictObject({\n name: z.string().max(80),\n value: z.union([z.string(), z.number()]).nullable(),\n }),\n )\n .max(HOSTED_AI_NOTE_SUGGESTION_MAX_NOTE_FIELDS),\n }),\n )\n .max(HOSTED_AI_NOTE_SUGGESTION_MAX_NOTES),\n});\n\nexport const HostedAiStreamPartSchema = z.looseObject({\n type: z.string().trim().min(1),\n});\n\n/**\n * The only stream part types this API emits. Every other part the AI SDK\n * produces (`start-step`, `finish-step`, `text-start`, ...) carries upstream\n * metadata — provider model id, response headers, request body — and is dropped\n * server-side so it never reaches a client.\n *\n * The consumer switch lives in the extension's background stream reader. Adding\n * a type here without teaching that switch about it is a no-op; removing one\n * breaks rendering. `error` is absent on purpose: it is converted into a thrown\n * error before it can be yielded.\n */\nexport const HOSTED_AI_CLIENT_STREAM_PART_TYPES = [\n \"text-delta\",\n \"reasoning-start\",\n \"reasoning-delta\",\n \"reasoning-end\",\n \"reasoning-file\",\n \"finish\",\n] as const;\n\n/**\n * Status is per-identity, not per-feature: one call reports every feature and\n * every pool, so a client caches a single response instead of one per feature.\n * Non-strict so a client still sending the retired `feature` argument gets a\n * useful response rather than a validation error.\n */\nexport const HostedAiStatusInputSchema = z.object({});\n\n/**\n * `pro_required` means the Pro plan or any plan above it; `ultra_required`\n * means Ultra. Appended last, so a client that predates a value falls back on\n * its own default instead of misreading it.\n */\nexport const HostedAiUnavailableReasonSchema = z.enum([\n \"authentication_required\",\n \"ultra_required\",\n \"quota_exhausted\",\n \"service_unavailable\",\n \"pro_required\",\n]);\n\n/**\n * The cheapest plan an account would need to buy for something it cannot use\n * now. Any plan above it works too, so `pro` reads as \"Pro or Ultra\".\n */\nexport const HostedAiUpgradePlanSchema = billingPlanSchema.exclude([\"free\"]);\n\nexport const HostedAiCreditPolicyIdSchema = z.enum([\n \"custom-action-guest-daily-v1\",\n \"custom-action-user-daily-v1\",\n \"custom-action-pro-daily-v1\",\n \"ultra-weekly-v1\",\n]);\n\nexport const HostedAiCreditPeriodKindSchema = z.enum([\"daily\", \"weekly\"]);\n\nexport const HostedAiQuotaScopeSchema = z.enum([\"guest\", \"user\"]);\n\n/**\n * Data payload of the TOO_MANY_REQUESTS error every hosted AI guard emits.\n * The code itself is ORPC's own rather than a PUBLIC_APP_ERROR_DEFS entry, so\n * this schema is the only contract tying the server's construction to the\n * extension's parsing of it.\n *\n * Deliberately NOT strict: installed extensions parse this payload at runtime\n * and lag server deploys by weeks, so rejecting unknown keys would turn any\n * additive server-side field into a fleet-wide parse failure that silently\n * drops retryAfterMs (queue backoff timing) and quotaScope (guest sign-in\n * prompt). Unknown keys are stripped; the required fields keep drift\n * protection.\n */\nexport const HostedAiRateLimitErrorDataSchema = z.object({\n retryAfterMs: z.number().int().min(0),\n quotaScope: HostedAiQuotaScopeSchema,\n});\n\n/**\n * A recurring pool: the plan's credit for a day or a week, which refills at\n * `resetAt`.\n *\n * Deliberately free of dollar amounts and of the versioned policy id. Clients\n * render a consumption bar and a reset time, so a percentage and a period kind\n * are all they need, and neither leaks what a call costs us. `usedPercent`\n * counts settled spend only: including in-flight reservations would make the\n * bar jump forward and then back as each stream settles.\n */\nexport const HostedAiRecurringCreditStatusSchema = z.strictObject({\n periodKind: HostedAiCreditPeriodKindSchema,\n usedPercent: z.number().min(0).max(100),\n resetAt: z.iso.datetime().nullable(),\n /**\n * Every feature drawing on this pool. Ultra shares one weekly pool across all\n * three, so the grouping lives here rather than inlined per feature — that way\n * a client can tell one shared pool from several separate ones.\n */\n features: z.array(HostedAiFeatureSchema).min(1),\n});\n\n/**\n * A one-time pool, such as credit from a campaign or from support. It never\n * refills: once spent or past `expiresAt` it is gone, so a client shows the\n * expiry, not a reset. It is drawn on only after the plan's own pool for a\n * feature is spent, or for a feature the plan does not fund. Listed until it\n * expires, even when spent. Same fields as a recurring pool otherwise.\n */\nexport const HostedAiOneTimeCreditStatusSchema = z.strictObject({\n periodKind: z.literal(\"once\"),\n usedPercent: z.number().min(0).max(100),\n expiresAt: z.iso.datetime(),\n features: z.array(HostedAiFeatureSchema).min(1),\n});\n\n/**\n * One pool that can pay for Built-in AI, told apart by `periodKind`: a\n * recurring `daily` or `weekly` pool refills at `resetAt`, a one-time (`once`)\n * pool ends at `expiresAt`. Narrow on `periodKind` before reading either.\n */\nexport const HostedAiCreditPoolStatusSchema = z.discriminatedUnion(\"periodKind\", [\n HostedAiRecurringCreditStatusSchema,\n HostedAiOneTimeCreditStatusSchema,\n]);\n\nexport const HostedAiTierStatusSchema = z.strictObject({\n accessAllowed: z.boolean(),\n available: z.boolean(),\n unavailableReason: HostedAiUnavailableReasonSchema.nullable(),\n /**\n * The cheapest plan this account would need to use the tier, or null when it\n * needs none: its plan or a one-time pool already covers it, or the tier is\n * open to every signed-in account. For a guest it is the plan needed after\n * signing in. Clients badge an option with it and offer that plan.\n */\n upgradeTo: HostedAiUpgradePlanSchema.nullable(),\n /**\n * @deprecated Read `upgradeTo`. Viewer-independent product fact: no\n * non-Ultra account can ever use this feature/tier. Extensions released\n * before `upgradeTo` badge options with it, including for Ultra accounts.\n *\n * TODO(2026-11-21): remove once those extensions have drained (#710).\n */\n requiresUltra: z.boolean(),\n modelRevision: z.string().trim().min(1),\n});\n\nexport const HostedAiFeatureStatusSchema = z.strictObject({\n normal: HostedAiTierStatusSchema,\n advance: HostedAiTierStatusSchema,\n});\n\nexport const HostedAiStatusOutputSchema = z.strictObject({\n /**\n * @deprecated Read `pools`. This lists the recurring pools only, never a\n * one-time one: extensions released before mengxi-ream/read-frog#2395 look\n * up a label for every entry's `periodKind`, and one they do not know\n * crashes their usage page. They also throw if the field is missing.\n *\n * TODO(2026-11-07): remove once those extensions have drained (#710).\n */\n credits: z.array(HostedAiRecurringCreditStatusSchema),\n /**\n * Everything that can pay for a feature, in the order the server draws on it:\n * the plan's recurring pools first, then one-time pools by soonest expiry. A\n * feature can appear in several entries.\n */\n pools: z.array(HostedAiCreditPoolStatusSchema),\n features: z.strictObject({\n pageTranslation: HostedAiFeatureStatusSchema,\n customAction: HostedAiFeatureStatusSchema,\n noteSuggestion: HostedAiFeatureStatusSchema,\n selectionTranslation: HostedAiFeatureStatusSchema,\n videoSubtitles: HostedAiFeatureStatusSchema,\n inputTranslation: HostedAiFeatureStatusSchema,\n languageDetection: HostedAiFeatureStatusSchema,\n }),\n});\n\nexport type HostedAiOutputFieldType = z.infer<typeof HostedAiOutputFieldTypeSchema>;\nexport type HostedAiOutputField = z.infer<typeof HostedAiOutputFieldSchema>;\nexport type HostedAiModelTier = z.infer<typeof HostedAiModelTierSchema>;\nexport type HostedAiFeature = z.infer<typeof HostedAiFeatureSchema>;\nexport type HostedAiStreamTextInput = z.infer<typeof HostedAiStreamTextInputSchema>;\nexport type HostedAiStreamStructuredObjectInput = z.infer<\n typeof HostedAiStreamStructuredObjectInputSchema\n>;\nexport type HostedAiNoteSuggestionStreamInput = z.infer<\n typeof HostedAiNoteSuggestionStreamInputSchema\n>;\nexport type HostedAiNoteSuggestionObject = z.infer<typeof HostedAiNoteSuggestionObjectSchema>;\nexport type HostedAiStreamPart = z.infer<typeof HostedAiStreamPartSchema>;\nexport type HostedAiStatusInput = z.infer<typeof HostedAiStatusInputSchema>;\nexport type HostedAiUnavailableReason = z.infer<typeof HostedAiUnavailableReasonSchema>;\nexport type HostedAiUpgradePlan = z.infer<typeof HostedAiUpgradePlanSchema>;\nexport type HostedAiCreditPolicyId = z.infer<typeof HostedAiCreditPolicyIdSchema>;\nexport type HostedAiCreditPeriodKind = z.infer<typeof HostedAiCreditPeriodKindSchema>;\nexport type HostedAiQuotaScope = z.infer<typeof HostedAiQuotaScopeSchema>;\nexport type HostedAiRateLimitErrorData = z.infer<typeof HostedAiRateLimitErrorDataSchema>;\nexport type HostedAiRecurringCreditStatus = z.infer<typeof HostedAiRecurringCreditStatusSchema>;\nexport type HostedAiOneTimeCreditStatus = z.infer<typeof HostedAiOneTimeCreditStatusSchema>;\nexport type HostedAiCreditPoolStatus = z.infer<typeof HostedAiCreditPoolStatusSchema>;\nexport type HostedAiTierStatus = z.infer<typeof HostedAiTierStatusSchema>;\nexport type HostedAiFeatureStatus = z.infer<typeof HostedAiFeatureStatusSchema>;\nexport type HostedAiStatusOutput = z.infer<typeof HostedAiStatusOutputSchema>;\n","import type { ErrorMap } from \"@orpc/contract\";\nimport { z } from \"zod\";\nimport {\n HostedAiCreditPolicyIdSchema,\n HostedAiModelTierSchema,\n HostedAiUpgradePlanSchema,\n} from \"./schemas/hosted-ai\";\n\ninterface PublicAppErrorDefinition {\n data?: z.ZodTypeAny;\n message: string;\n status: number;\n}\n\nexport const CellValidationFailureReasonSchema = z.enum([\n \"unknown_notebase_column\",\n \"type_mismatch\",\n \"invalid_select_option\",\n \"invalid_date_format\",\n]);\nexport type CellValidationFailureReason = z.infer<typeof CellValidationFailureReasonSchema>;\n\nexport const CellValidationFailureDetailsSchema = z\n .object({\n expectedFormat: z.string().optional(),\n expectedType: z.string().optional(),\n receivedType: z.string().optional(),\n receivedValue: z.unknown().optional(),\n validOptions: z.array(z.string()).optional(),\n })\n .strict();\nexport type CellValidationFailureDetails = z.infer<typeof CellValidationFailureDetailsSchema>;\n\nexport const CellValidationFailedDataSchema = z\n .object({\n notebaseColumnId: z.string(),\n details: CellValidationFailureDetailsSchema,\n reason: CellValidationFailureReasonSchema,\n /** Index of the failing row within a batch input (createMany / updateMany / initialRows). */\n rowIndex: z.number().int().min(0).optional(),\n })\n .strict();\nexport type CellValidationFailedData = z.infer<typeof CellValidationFailedDataSchema>;\n\nexport const CardTemplateInvalidColumnsDataSchema = z\n .object({\n notebaseColumnIds: z.array(z.string()),\n })\n .strict();\nexport type CardTemplateInvalidColumnsData = z.infer<typeof CardTemplateInvalidColumnsDataSchema>;\n\nexport const CardTemplateInvalidLayoutDataSchema = z\n .object({\n errors: z.array(\n z\n .object({\n side: z.enum([\"front\", \"back\"]),\n message: z.string(),\n // UTF-16 offsets into that face's layout, when the parser knows them.\n from: z.number().int().min(0).optional(),\n to: z.number().int().min(0).optional(),\n })\n .strict(),\n ),\n })\n .strict();\nexport type CardTemplateInvalidLayoutData = z.infer<typeof CardTemplateInvalidLayoutDataSchema>;\n\n// The templates that use the column, which keep it from being deleted.\nexport const CardTemplateNotebaseColumnInUseDataSchema = z\n .object({\n templates: z.array(z.object({ id: z.uuid(), name: z.string() }).strict()),\n })\n .strict();\nexport type CardTemplateNotebaseColumnInUseData = z.infer<\n typeof CardTemplateNotebaseColumnInUseDataSchema\n>;\n\nexport const HostedAiTierRestrictedDataSchema = z.strictObject({\n modelTier: HostedAiModelTierSchema,\n /** The cheapest plan that unlocks it; a client offers \"Pro or Ultra\" for `pro`. */\n upgradeTo: HostedAiUpgradePlanSchema,\n});\n\nexport const HostedAiQuotaExhaustedDataSchema = z.strictObject({\n modelTier: HostedAiModelTierSchema,\n // Reuses the credit-status enum rather than restating it: these two always\n // describe the same set of policy ids, and a second copy silently drifts —\n // the error payload is `strictObject`, so a policy missing only here fails\n // output validation at exactly the moment a user runs out of credit.\n policyId: HostedAiCreditPolicyIdSchema,\n usedPercent: z.number().min(0).max(100),\n resetAt: z.iso.datetime().nullable(),\n});\n\nexport const SpeechDailyLimitReachedDataSchema = z.strictObject({\n limit: z.number().int().min(0),\n resetAt: z.iso.datetime(),\n});\n\nexport const PUBLIC_APP_ERROR_DEFS = {\n RESOURCE_UPDATE_CONFLICT: {\n message: \"The resource changed. Read it again before updating.\",\n status: 409,\n },\n RESOURCE_ALREADY_EXISTS: { message: \"A resource with this ID already exists.\", status: 409 },\n FIELD_TYPE_CHANGE_UNSUPPORTED: {\n message: \"This operation cannot change the field type.\",\n status: 400,\n },\n HOSTED_AI_TIER_RESTRICTED: {\n data: HostedAiTierRestrictedDataSchema,\n message: \"This Built-in AI tier is not available for this account\",\n status: 403,\n },\n HOSTED_AI_QUOTA_EXHAUSTED: {\n data: HostedAiQuotaExhaustedDataSchema,\n message: \"Built-in AI credit exhausted\",\n status: 429,\n },\n NOTEBASE_NOT_FOUND: {\n message: \"Notebase not found\",\n status: 404,\n },\n VIDEO_TRANSCRIPTION_SUBSCRIPTION_REQUIRED: {\n message: \"AI subtitles require a Pro or Ultra subscription\",\n status: 403,\n },\n // Dunning (`past_due` / `paused`), not cancellation: the account keeps\n // reading subtitles it already paid to generate, but cannot start new work\n // that spends upstream money until the payment method is fixed. Distinct\n // from SUBSCRIPTION_REQUIRED so the client can say \"update your card\"\n // instead of \"subscribe\".\n VIDEO_TRANSCRIPTION_PAYMENT_REQUIRED: {\n message: \"Update your payment method to generate new AI subtitles\",\n status: 402,\n },\n VIDEO_TRANSCRIPT_NOT_FOUND: {\n message: \"Video transcript not found\",\n status: 404,\n },\n VIDEO_TRANSCRIPT_NOT_READY: {\n message: \"Video transcript is not ready yet\",\n status: 409,\n },\n VIDEO_TRANSCRIPTION_QUOTA_EXCEEDED: {\n message: \"Monthly transcription quota exceeded\",\n status: 429,\n },\n // A property of the video, not of the account: upgrading or waiting for the\n // quota to reset changes nothing. Kept apart from QUOTA_EXCEEDED so the\n // client does not answer it with an upgrade wall.\n VIDEO_TRANSCRIPTION_UNSUPPORTED_LENGTH: {\n message: \"This video is longer than AI subtitles support\",\n status: 422,\n },\n // The day's read-aloud requests are used up (`SPEECH_DAILY_REQUEST_LIMITS`).\n SPEECH_DAILY_LIMIT_REACHED: {\n data: SpeechDailyLimitReachedDataSchema,\n message: \"Today's read-aloud limit is reached\",\n status: 429,\n },\n // No voice service to read with right now: not configured, or failing.\n SPEECH_UNAVAILABLE: {\n message: \"Reading aloud is unavailable right now\",\n status: 503,\n },\n NOTEBASE_COLUMN_NOT_FOUND: {\n message: \"Notebase column not found\",\n status: 404,\n },\n NOTEBASE_ROW_NOT_FOUND: {\n message: \"Notebase row not found\",\n status: 404,\n },\n CARD_NOT_FOUND: {\n message: \"Card not found\",\n status: 404,\n },\n CARD_TEMPLATE_NOT_FOUND: {\n message: \"Card template not found\",\n status: 404,\n },\n CARD_TEMPLATE_INVALID_NOTEBASE_COLUMNS: {\n data: CardTemplateInvalidColumnsDataSchema,\n message: \"Card template references unknown notebase columns\",\n status: 422,\n },\n CARD_TEMPLATE_INVALID_LAYOUT: {\n data: CardTemplateInvalidLayoutDataSchema,\n message: \"Card template layout does not parse\",\n status: 422,\n },\n CARD_TEMPLATE_NOTEBASE_COLUMN_IN_USE: {\n data: CardTemplateNotebaseColumnInUseDataSchema,\n message: \"Notebase column is used by a card template\",\n status: 409,\n },\n NOTE_LIMIT_EXCEEDED: {\n message: \"Upgrade is required to create more Notebase notes\",\n status: 403,\n },\n BILLING_NOT_CONFIGURED: {\n message: \"Billing is not configured\",\n status: 503,\n },\n BILLING_CUSTOMER_NOT_FOUND: {\n message: \"Billing customer not found\",\n status: 404,\n },\n BILLING_PASS_ACTIVE: {\n message: \"An active Pro pass already covers this account\",\n status: 409,\n },\n BILLING_CHANGE_SCHEDULED: {\n message: \"A subscription change is already scheduled\",\n status: 409,\n },\n CARD_NOT_REVIEWABLE: {\n message: \"Card cannot be reviewed in its current state\",\n status: 409,\n },\n CARD_REVIEW_STATE_STALE: {\n message: \"Card review state is stale\",\n status: 409,\n },\n CARD_REVIEW_ROLLBACK_UNAVAILABLE: {\n message: \"Card review cannot be rolled back\",\n status: 409,\n },\n CARD_ALREADY_BURIED: {\n message: \"Card is already buried\",\n status: 409,\n },\n CARD_NOT_BURIED: {\n message: \"Card is not buried\",\n status: 409,\n },\n CARD_ALREADY_SUSPENDED: {\n message: \"Card is already suspended\",\n status: 409,\n },\n CARD_NOT_SUSPENDED: {\n message: \"Card is not suspended\",\n status: 409,\n },\n CARD_STATUS_CHANGE_UNAVAILABLE: {\n message: \"Card status change is unavailable\",\n status: 409,\n },\n NOTEBASE_VIEW_NOT_FOUND: {\n message: \"Notebase view not found\",\n status: 404,\n },\n CELL_VALIDATION_FAILED: {\n data: CellValidationFailedDataSchema,\n message: \"Cell validation failed\",\n status: 422,\n },\n PRIMARY_NOTEBASE_COLUMN_DELETE_NOT_ALLOWED: {\n message: \"Cannot delete primary notebase column\",\n status: 400,\n },\n CONCURRENT_POSITION_CONFLICT: {\n message: \"Concurrent position conflict, please retry\",\n status: 409,\n },\n EBOOK_BETA_RESTRICTED: {\n message: \"Ebooks are currently in beta for selected accounts\",\n status: 403,\n },\n EBOOK_NOT_FOUND: {\n message: \"Ebook not found\",\n status: 404,\n },\n EBOOK_LIMIT_EXCEEDED: {\n message: \"Upgrade is required to upload more ebooks\",\n status: 403,\n },\n EBOOK_FILE_TOO_LARGE: {\n message: \"Ebook file exceeds the maximum allowed size\",\n status: 413,\n },\n EBOOK_UPLOAD_NOT_COMPLETED: {\n message: \"Ebook upload has not been completed\",\n status: 409,\n },\n // An email's unsubscribe or preferences link that does not verify, or whose\n // account no longer exists. The page asks the reader to sign in instead.\n EMAIL_LINK_INVALID: {\n message: \"This email link is not valid\",\n status: 400,\n },\n} as const satisfies Record<string, PublicAppErrorDefinition>;\n\nexport type PublicAppErrorCode = keyof typeof PUBLIC_APP_ERROR_DEFS;\n\nexport type PublicAppErrorData<TCode extends PublicAppErrorCode> =\n (typeof PUBLIC_APP_ERROR_DEFS)[TCode] extends { data: infer TSchema extends z.ZodTypeAny }\n ? z.output<TSchema>\n : undefined;\n\nexport function isPublicAppErrorCode(code: string | undefined): code is PublicAppErrorCode {\n return code !== undefined && code in PUBLIC_APP_ERROR_DEFS;\n}\n\nexport function getPublicErrorDefinition<TCode extends PublicAppErrorCode>(code: TCode) {\n return PUBLIC_APP_ERROR_DEFS[code];\n}\n\nexport function pickPublicErrorMap<const TCodes extends readonly PublicAppErrorCode[]>(\n ...codes: TCodes\n) {\n return Object.fromEntries(\n codes.map((code) => {\n const definition = PUBLIC_APP_ERROR_DEFS[code];\n\n if (\"data\" in definition) {\n return [\n code,\n {\n data: definition.data,\n message: definition.message,\n status: definition.status,\n },\n ];\n }\n\n return [\n code,\n {\n message: definition.message,\n status: definition.status,\n },\n ];\n }),\n ) as Pick<ErrorMap, TCodes[number]>;\n}\n","import { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n billingCancelScheduledChangeOutputSchema,\n billingCreateCheckoutSessionInputSchema,\n billingCreateCustomerPortalSessionInputSchema,\n billingSessionUrlOutputSchema,\n billingStatusSchema,\n} from \"#/schemas/billing\";\n\nconst billingProcedure = oc.errors(\n pickPublicErrorMap(\n \"BILLING_NOT_CONFIGURED\",\n \"BILLING_CUSTOMER_NOT_FOUND\",\n \"BILLING_PASS_ACTIVE\",\n \"BILLING_CHANGE_SCHEDULED\",\n ),\n);\n\nexport const billingContract = {\n status: billingProcedure\n .route({\n method: \"GET\",\n path: \"/billing/status\",\n summary: \"Get authenticated user's billing status\",\n tags: [\"Billing\"],\n })\n .output(billingStatusSchema),\n createCheckoutSession: billingProcedure\n .route({\n method: \"POST\",\n path: \"/billing/checkout-sessions\",\n summary: \"Create a localized Stripe Checkout Session for a subscription\",\n tags: [\"Billing\"],\n })\n .input(billingCreateCheckoutSessionInputSchema)\n .output(billingSessionUrlOutputSchema),\n createCustomerPortalSession: billingProcedure\n .route({\n method: \"POST\",\n path: \"/billing/customer-portal-sessions\",\n summary: \"Create a Stripe Customer Portal Session\",\n tags: [\"Billing\"],\n })\n .input(billingCreateCustomerPortalSessionInputSchema)\n .output(billingSessionUrlOutputSchema),\n cancelScheduledChange: billingProcedure\n .route({\n method: \"POST\",\n path: \"/billing/scheduled-change/cancel\",\n summary: \"Cancel a scheduled subscription change\",\n tags: [\"Billing\"],\n })\n .output(billingCancelScheduledChangeOutputSchema),\n};\n","import type { Route } from \"@orpc/contract\";\nimport { oc } from \"@orpc/contract\";\n\n/**\n * A documented business route shared by OpenAPI and agent-facing adapters.\n * Both prose fields are required so adapters can reuse them without a second\n * copy or an undefined fallback.\n */\nexport type AgentRoute = Route & { summary: string; description: string };\n\n/**\n * Declares a procedure that is exposed to agents as an MCP tool, not only to\n * the REST/OpenAPI surface.\n *\n * oRPC types `~orpc.route` as the widened `Route`, so `route.summary` reads back\n * as `string | undefined` whatever is passed in. `$meta` is the only channel it\n * keeps generic, so the prose is mirrored there and stays a required `string`\n * for tool definitions. OpenAPI keeps reading `route`.\n */\nexport function defineAgentProcedure(route: AgentRoute) {\n return oc.$meta({ summary: route.summary, description: route.description }).route(route);\n}\n","import { z } from \"zod\";\nexport const paginationShape = {\n // Existing callers omit pagination to read all matching records.\n limit: z.number().int().min(1).max(500).optional(),\n offset: z.number().int().min(0).optional(),\n};\nexport function pageSchema<T extends z.ZodType>(itemSchema: T) {\n return z.object({ items: z.array(itemSchema), hasMore: z.boolean() });\n}\n","import { z } from \"zod\";\nexport const expectedUpdatedAtSchema = z.iso.datetime({ offset: true });\nexport const deletionResultSchema = z.object({\n id: z.uuid(),\n txid: z.number(),\n});\n","import { paginationShape, pageSchema } from \"./pagination\";\nimport { deletionResultSchema, expectedUpdatedAtSchema } from \"./resource-mutation\";\nimport {\n cardIdentityShape,\n cardMemoryStateShape,\n cardStateSchema,\n cardTemplateConfigSchema,\n cardTemplateCreatedBySchema,\n scheduleStatusSchema,\n} from \"@read-frog/definitions\";\nimport { z } from \"zod\";\n\nexport { cardStateSchema, scheduleStatusSchema };\nexport type { CardState, ScheduleStatus } from \"@read-frog/definitions\";\n\nexport const cardTemplateSchema = z.object({\n id: z.uuid(),\n notebaseId: z.uuid(),\n name: z.string(),\n config: cardTemplateConfigSchema,\n createdBy: cardTemplateCreatedBySchema.describe(\n 'Who made the template: \"user\", or \"system\" for the default template Read Frog gives a notebase whose fields fit one.',\n ),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\nexport type CardTemplate = z.infer<typeof cardTemplateSchema>;\n\nexport const CardTemplateListInputSchema = z.object({\n ...paginationShape,\n notebaseId: z.uuid().optional(),\n});\nexport type CardTemplateListInput = z.infer<typeof CardTemplateListInputSchema>;\n\nexport const CardTemplateListOutputSchema = pageSchema(cardTemplateSchema);\nexport type CardTemplateListOutput = z.infer<typeof CardTemplateListOutputSchema>;\n\nexport const CardTemplateGetInputSchema = z.object({\n id: z.uuid(),\n});\nexport type CardTemplateGetInput = z.infer<typeof CardTemplateGetInputSchema>;\n\nexport const CardTemplateGetOutputSchema = cardTemplateSchema;\nexport type CardTemplateGetOutput = z.infer<typeof CardTemplateGetOutputSchema>;\n\nexport const CardTemplateCreateInputSchema = z\n .object({\n id: z.uuid().optional(),\n notebaseId: z.uuid(),\n name: z.string().min(1),\n config: cardTemplateConfigSchema,\n })\n .strict();\nexport type CardTemplateCreateInput = z.infer<typeof CardTemplateCreateInputSchema>;\n\nexport const CardTemplateCreateOutputSchema = cardTemplateSchema.extend({\n txid: z.number(),\n});\nexport type CardTemplateCreateOutput = z.infer<typeof CardTemplateCreateOutputSchema>;\n\nexport const CardTemplateUpdateInputSchema = z\n .object({\n expectedUpdatedAt: expectedUpdatedAtSchema.optional(),\n id: z.uuid(),\n name: z.string().min(1).optional(),\n config: cardTemplateConfigSchema.optional(),\n })\n .strict();\nexport type CardTemplateUpdateInput = z.infer<typeof CardTemplateUpdateInputSchema>;\n\nexport const CardTemplateUpdateOutputSchema = cardTemplateSchema.extend({\n txid: z.number(),\n});\nexport type CardTemplateUpdateOutput = z.infer<typeof CardTemplateUpdateOutputSchema>;\n\nexport const CardTemplateDeleteInputSchema = z.object({\n id: z.uuid(),\n});\nexport type CardTemplateDeleteInput = z.infer<typeof CardTemplateDeleteInputSchema>;\n\nexport const CardTemplateDeleteOutputSchema = deletionResultSchema;\nexport type CardTemplateDeleteOutput = z.infer<typeof CardTemplateDeleteOutputSchema>;\n\nexport const cardSchema = z.object({\n ...cardIdentityShape,\n ...cardMemoryStateShape,\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\nexport type Card = z.infer<typeof cardSchema>;\n\nexport const renderedCardSchema = cardSchema.extend({\n front: z.string(),\n back: z.string(),\n});\nexport type RenderedCard = z.infer<typeof renderedCardSchema>;\n\nexport const CardListInputSchema = z.object({\n notebaseId: z.uuid().optional(),\n templateId: z.uuid().optional(),\n scheduleStatus: scheduleStatusSchema.optional(),\n ...paginationShape,\n});\nexport type CardListInput = z.infer<typeof CardListInputSchema>;\n\nexport const CardListOutputSchema = pageSchema(renderedCardSchema);\nexport type CardListOutput = z.infer<typeof CardListOutputSchema>;\n\nexport const CardGetInputSchema = z.object({\n id: z.uuid(),\n});\nexport type CardGetInput = z.infer<typeof CardGetInputSchema>;\n\nexport const CardGetOutputSchema = renderedCardSchema;\nexport type CardGetOutput = z.infer<typeof CardGetOutputSchema>;\n\nexport const CardGenerateInputSchema = z.object({\n notebaseId: z.uuid(),\n templateId: z.uuid().optional(),\n});\nexport type CardGenerateInput = z.infer<typeof CardGenerateInputSchema>;\n\nexport const CardGenerateOutputSchema = z.object({\n created: z.number().int().min(0),\n txid: z.number(),\n});\nexport type CardGenerateOutput = z.infer<typeof CardGenerateOutputSchema>;\n","import { defineAgentProcedure } from \"./shared\";\nimport { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n CardGenerateInputSchema,\n CardGenerateOutputSchema,\n CardGetInputSchema,\n CardGetOutputSchema,\n CardListInputSchema,\n CardListOutputSchema,\n} from \"#/schemas/card\";\n\nexport const cardContract = {\n list: defineAgentProcedure({\n method: \"GET\",\n path: \"/cards\",\n summary: \"List cards\",\n description:\n \"Browse owned cards with rendered fronts, backs, source IDs and learning state. Optionally filter by notebase, template or scheduleStatus. Supports limit and offset pagination.\",\n tags: [\"Cards\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(CardListInputSchema)\n .output(CardListOutputSchema),\n\n get: defineAgentProcedure({\n method: \"GET\",\n path: \"/cards/{id}\",\n summary: \"Get card\",\n description:\n \"Read one owned card with its rendered front, back, source IDs and learning state.\",\n tags: [\"Cards\"],\n })\n .errors(pickPublicErrorMap(\"CARD_NOT_FOUND\"))\n .input(CardGetInputSchema)\n .output(CardGetOutputSchema),\n\n generate: oc\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\", \"CARD_TEMPLATE_NOT_FOUND\"))\n .route({\n method: \"POST\",\n path: \"/cards/generate\",\n summary: \"Generate missing cards\",\n tags: [\"Cards\"],\n })\n .input(CardGenerateInputSchema)\n .output(CardGenerateOutputSchema),\n};\n","import { defineAgentProcedure } from \"./shared\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n CardTemplateCreateInputSchema,\n CardTemplateCreateOutputSchema,\n CardTemplateDeleteInputSchema,\n CardTemplateDeleteOutputSchema,\n CardTemplateGetInputSchema,\n CardTemplateGetOutputSchema,\n CardTemplateListInputSchema,\n CardTemplateListOutputSchema,\n CardTemplateUpdateInputSchema,\n CardTemplateUpdateOutputSchema,\n} from \"#/schemas/card\";\n\nexport const cardTemplateContract = {\n list: defineAgentProcedure({\n method: \"GET\",\n path: \"/card-templates\",\n summary: \"List card templates\",\n description:\n \"List owned card templates, optionally filtered by notebase. Supports limit and offset pagination.\",\n tags: [\"Card Templates\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(CardTemplateListInputSchema)\n .output(CardTemplateListOutputSchema),\n\n get: defineAgentProcedure({\n method: \"GET\",\n path: \"/card-templates/{id}\",\n summary: \"Get card template\",\n description: \"Read the complete definition and updatedAt timestamp of an owned card template.\",\n tags: [\"Card Templates\"],\n })\n .errors(pickPublicErrorMap(\"CARD_TEMPLATE_NOT_FOUND\"))\n .input(CardTemplateGetInputSchema)\n .output(CardTemplateGetOutputSchema),\n\n create: defineAgentProcedure({\n method: \"POST\",\n path: \"/card-templates\",\n summary: \"Create card template\",\n description:\n 'Create a template in an owned notebase; it generates a card for every existing note. Each face (front, back) is either { columns: [column IDs], style }, those columns in a built-in style that stays editable in the website\\'s simple mode, or { layout: \"<HTML + Liquid>\" } for a custom design that references a column as {{ [\"<column id>\"] }}. Prefer columns faces. Get column IDs from the notebase schema.',\n tags: [\"Card Templates\"],\n })\n .errors(\n pickPublicErrorMap(\n \"NOTEBASE_NOT_FOUND\",\n \"CARD_TEMPLATE_INVALID_NOTEBASE_COLUMNS\",\n \"CARD_TEMPLATE_INVALID_LAYOUT\",\n ),\n )\n .errors(pickPublicErrorMap(\"RESOURCE_ALREADY_EXISTS\"))\n .input(CardTemplateCreateInputSchema)\n .output(CardTemplateCreateOutputSchema),\n\n update: defineAgentProcedure({\n method: \"PATCH\",\n path: \"/card-templates/{id}\",\n summary: \"Update card template\",\n description:\n \"Change an owned template name or faces (see creating a template for the face shapes). Rendered cards reflect the saved template. expectedUpdatedAt guards against editing stale data.\",\n tags: [\"Card Templates\"],\n })\n .errors(\n pickPublicErrorMap(\n \"CARD_TEMPLATE_NOT_FOUND\",\n \"CARD_TEMPLATE_INVALID_NOTEBASE_COLUMNS\",\n \"CARD_TEMPLATE_INVALID_LAYOUT\",\n ),\n )\n .errors(pickPublicErrorMap(\"RESOURCE_UPDATE_CONFLICT\"))\n .input(CardTemplateUpdateInputSchema)\n .output(CardTemplateUpdateOutputSchema),\n\n delete: defineAgentProcedure({\n method: \"DELETE\",\n path: \"/card-templates/{id}\",\n summary: \"Delete card template\",\n description:\n \"Permanently delete an owned template and its generated cards and review records. Source notes are preserved.\",\n tags: [\"Card Templates\"],\n })\n .errors(pickPublicErrorMap(\"CARD_TEMPLATE_NOT_FOUND\"))\n .input(CardTemplateDeleteInputSchema)\n .output(CardTemplateDeleteOutputSchema),\n};\n","import { EBOOK_ALLOWED_COVER_CONTENT_TYPES } from \"@read-frog/definitions\";\nimport { z } from \"zod\";\n\nexport const ebookStatusSchema = z.enum([\"pending\", \"ready\"]);\nexport type EbookStatus = z.infer<typeof ebookStatusSchema>;\n\nexport const ebookCoverContentTypeSchema = z.enum(EBOOK_ALLOWED_COVER_CONTENT_TYPES);\nexport type EbookCoverContentType = z.infer<typeof ebookCoverContentTypeSchema>;\n\nexport const ebookListItemSchema = z\n .object({\n id: z.uuid(),\n title: z.string(),\n author: z.string().nullable(),\n language: z.string().nullable(),\n fileByteSize: z.number().int(),\n status: ebookStatusSchema,\n progressFraction: z.number(),\n lastReadAt: z.coerce.date().nullable(),\n coverUrl: z.url().nullable(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n })\n .strict();\nexport type EbookListItem = z.infer<typeof ebookListItemSchema>;\n\nexport const ebookDetailSchema = ebookListItemSchema.extend({\n progressCfi: z.string().nullable(),\n});\nexport type EbookDetail = z.infer<typeof ebookDetailSchema>;\n\nexport const ebookQuotaSchema = z\n .object({\n count: z.number().int().min(0),\n // 0 is a valid limit: uploading is a paid feature, so free plans get no quota.\n limit: z.number().int().min(0),\n })\n .strict();\nexport type EbookQuota = z.infer<typeof ebookQuotaSchema>;\n\nexport const ebookListInputSchema = z.object({}).strict();\nexport type EbookListInput = z.infer<typeof ebookListInputSchema>;\n\nexport const ebookListOutputSchema = z\n .object({\n items: z.array(ebookListItemSchema),\n quota: ebookQuotaSchema,\n })\n .strict();\nexport type EbookListOutput = z.infer<typeof ebookListOutputSchema>;\n\nexport const ebookGetInputSchema = z\n .object({\n id: z.uuid(),\n })\n .strict();\nexport type EbookGetInput = z.infer<typeof ebookGetInputSchema>;\n\nexport const ebookGetOutputSchema = z\n .object({\n ebook: ebookDetailSchema,\n })\n .strict();\nexport type EbookGetOutput = z.infer<typeof ebookGetOutputSchema>;\n\nexport const ebookRequestUploadInputSchema = z\n .object({\n title: z.string().min(1).max(500),\n author: z.string().max(500).optional(),\n language: z.string().max(35).optional(),\n // Exact sizes: each upload is signed for them, and storage refuses any other file.\n fileByteSize: z.number().int().min(1),\n cover: z\n .object({\n contentType: ebookCoverContentTypeSchema,\n byteSize: z.number().int().min(1),\n })\n .strict()\n .optional(),\n })\n .strict();\nexport type EbookRequestUploadInput = z.infer<typeof ebookRequestUploadInputSchema>;\n\n/**\n * A signed PUT: send the file to `url` with exactly `headers`. The signature\n * covers the file's type and exact size, so storage refuses any other file.\n */\nexport const ebookPresignedUploadSchema = z\n .object({\n url: z.url(),\n headers: z.record(z.string(), z.string()),\n })\n .strict();\nexport type EbookPresignedUpload = z.infer<typeof ebookPresignedUploadSchema>;\n\nexport const ebookRequestUploadOutputSchema = z\n .object({\n ebookId: z.uuid(),\n upload: ebookPresignedUploadSchema,\n coverUpload: ebookPresignedUploadSchema.nullable(),\n expiresAt: z.coerce.date(),\n })\n .strict();\nexport type EbookRequestUploadOutput = z.infer<typeof ebookRequestUploadOutputSchema>;\n\nexport const ebookFinalizeUploadInputSchema = z\n .object({\n ebookId: z.uuid(),\n })\n .strict();\nexport type EbookFinalizeUploadInput = z.infer<typeof ebookFinalizeUploadInputSchema>;\n\nexport const ebookFinalizeUploadOutputSchema = z\n .object({\n ebook: ebookListItemSchema,\n })\n .strict();\nexport type EbookFinalizeUploadOutput = z.infer<typeof ebookFinalizeUploadOutputSchema>;\n\nexport const ebookGetDownloadUrlInputSchema = z\n .object({\n id: z.uuid(),\n })\n .strict();\nexport type EbookGetDownloadUrlInput = z.infer<typeof ebookGetDownloadUrlInputSchema>;\n\nexport const ebookGetDownloadUrlOutputSchema = z\n .object({\n url: z.url(),\n expiresAt: z.coerce.date(),\n })\n .strict();\nexport type EbookGetDownloadUrlOutput = z.infer<typeof ebookGetDownloadUrlOutputSchema>;\n\nexport const ebookUpdateProgressDataSchema = z\n .object({\n cfi: z.string().max(2000),\n fraction: z.number().min(0).max(1),\n })\n .strict();\nexport type EbookUpdateProgressData = z.infer<typeof ebookUpdateProgressDataSchema>;\n\nexport const ebookUpdateProgressInputSchema = ebookUpdateProgressDataSchema.extend({\n id: z.uuid(),\n});\nexport type EbookUpdateProgressInput = z.infer<typeof ebookUpdateProgressInputSchema>;\n\nexport const ebookUpdateProgressOutputSchema = z\n .object({\n lastReadAt: z.coerce.date(),\n })\n .strict();\nexport type EbookUpdateProgressOutput = z.infer<typeof ebookUpdateProgressOutputSchema>;\n\nexport const ebookRenameDataSchema = z\n .object({\n title: z.string().min(1).max(500),\n author: z.string().max(500).nullable().optional(),\n })\n .strict();\nexport type EbookRenameData = z.infer<typeof ebookRenameDataSchema>;\n\nexport const ebookRenameInputSchema = ebookRenameDataSchema.extend({\n id: z.uuid(),\n});\nexport type EbookRenameInput = z.infer<typeof ebookRenameInputSchema>;\n\nexport const ebookRenameOutputSchema = z\n .object({\n ebook: ebookListItemSchema,\n })\n .strict();\nexport type EbookRenameOutput = z.infer<typeof ebookRenameOutputSchema>;\n\nexport const ebookDeleteInputSchema = z\n .object({\n id: z.uuid(),\n })\n .strict();\nexport type EbookDeleteInput = z.infer<typeof ebookDeleteInputSchema>;\n\nexport const ebookDeleteOutputSchema = z\n .object({\n id: z.uuid(),\n })\n .strict();\nexport type EbookDeleteOutput = z.infer<typeof ebookDeleteOutputSchema>;\n","import { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n ebookDeleteInputSchema,\n ebookDeleteOutputSchema,\n ebookFinalizeUploadInputSchema,\n ebookFinalizeUploadOutputSchema,\n ebookGetDownloadUrlInputSchema,\n ebookGetDownloadUrlOutputSchema,\n ebookGetInputSchema,\n ebookGetOutputSchema,\n ebookListInputSchema,\n ebookListOutputSchema,\n ebookRenameInputSchema,\n ebookRenameOutputSchema,\n ebookRequestUploadInputSchema,\n ebookRequestUploadOutputSchema,\n ebookUpdateProgressInputSchema,\n ebookUpdateProgressOutputSchema,\n} from \"#/schemas/ebook\";\n\nconst ebookProcedure = oc;\n\nexport const ebookContract = {\n list: ebookProcedure\n .errors(pickPublicErrorMap(\"EBOOK_BETA_RESTRICTED\"))\n .route({\n method: \"GET\",\n path: \"/ebooks\",\n summary: \"List ebooks with quota\",\n tags: [\"Ebooks\"],\n })\n .input(ebookListInputSchema)\n .output(ebookListOutputSchema),\n\n get: ebookProcedure\n .errors(pickPublicErrorMap(\"EBOOK_BETA_RESTRICTED\", \"EBOOK_NOT_FOUND\"))\n .route({\n method: \"GET\",\n path: \"/ebooks/{id}\",\n summary: \"Get an ebook with reading progress\",\n tags: [\"Ebooks\"],\n })\n .input(ebookGetInputSchema)\n .output(ebookGetOutputSchema),\n\n requestUpload: ebookProcedure\n .errors(\n pickPublicErrorMap(\"EBOOK_BETA_RESTRICTED\", \"EBOOK_LIMIT_EXCEEDED\", \"EBOOK_FILE_TOO_LARGE\"),\n )\n .route({\n method: \"POST\",\n path: \"/ebooks/uploads\",\n summary: \"Request presigned upload URLs for a new ebook\",\n tags: [\"Ebooks\"],\n })\n .input(ebookRequestUploadInputSchema)\n .output(ebookRequestUploadOutputSchema),\n\n finalizeUpload: ebookProcedure\n .errors(\n pickPublicErrorMap(\n \"EBOOK_BETA_RESTRICTED\",\n \"EBOOK_NOT_FOUND\",\n \"EBOOK_UPLOAD_NOT_COMPLETED\",\n \"EBOOK_FILE_TOO_LARGE\",\n ),\n )\n .route({\n method: \"POST\",\n path: \"/ebooks/{ebookId}/finalize\",\n summary: \"Finalize an ebook upload\",\n tags: [\"Ebooks\"],\n })\n .input(ebookFinalizeUploadInputSchema)\n .output(ebookFinalizeUploadOutputSchema),\n\n getDownloadUrl: ebookProcedure\n .errors(pickPublicErrorMap(\"EBOOK_BETA_RESTRICTED\", \"EBOOK_NOT_FOUND\"))\n .route({\n method: \"GET\",\n path: \"/ebooks/{id}/download-url\",\n summary: \"Get a presigned download URL for an ebook\",\n tags: [\"Ebooks\"],\n })\n .input(ebookGetDownloadUrlInputSchema)\n .output(ebookGetDownloadUrlOutputSchema),\n\n updateProgress: ebookProcedure\n .errors(pickPublicErrorMap(\"EBOOK_BETA_RESTRICTED\", \"EBOOK_NOT_FOUND\"))\n .route({\n method: \"PATCH\",\n path: \"/ebooks/{id}/progress\",\n summary: \"Update ebook reading progress\",\n tags: [\"Ebooks\"],\n })\n .input(ebookUpdateProgressInputSchema)\n .output(ebookUpdateProgressOutputSchema),\n\n rename: ebookProcedure\n .errors(pickPublicErrorMap(\"EBOOK_BETA_RESTRICTED\", \"EBOOK_NOT_FOUND\"))\n .route({\n method: \"PATCH\",\n path: \"/ebooks/{id}\",\n summary: \"Rename an ebook\",\n tags: [\"Ebooks\"],\n })\n .input(ebookRenameInputSchema)\n .output(ebookRenameOutputSchema),\n\n delete: ebookProcedure\n .errors(pickPublicErrorMap(\"EBOOK_BETA_RESTRICTED\", \"EBOOK_NOT_FOUND\"))\n .route({\n method: \"DELETE\",\n path: \"/ebooks/{id}\",\n summary: \"Delete an ebook\",\n tags: [\"Ebooks\"],\n })\n .input(ebookDeleteInputSchema)\n .output(ebookDeleteOutputSchema),\n};\n","import { z } from \"zod\";\nimport { appLocaleSchema } from \"./app-locale\";\n\n// Which marketing and lifecycle emails a user gets, by category. Read and\n// changed signed in (the settings page), or through the signed token in an\n// email's unsubscribe link (the unsubscribe page that link opens, which needs\n// no sign-in). Category names come from the server in the requested locale.\n\n/** A category's key, such as `promotions`. */\nexport const emailCategoryKeySchema = z\n .string()\n .max(64)\n .regex(/^[a-z][a-z0-9_]*$/);\nexport type EmailCategoryKey = z.infer<typeof emailCategoryKeySchema>;\n\n/** The token in an email's unsubscribe link. */\nexport const emailLinkTokenSchema = z.string().min(1).max(1024);\n\nexport const emailCategoryStateSchema = z\n .object({\n key: z.string(),\n // In the requested locale, or English when the category has none for it.\n name: z.string(),\n description: z.string().nullable(),\n // Promotional mail.\n commercial: z.boolean(),\n // Notices about the account and the service, which nobody can unsubscribe\n // from: always subscribed, \"unsubscribe from all\" included, and a change\n // to it is ignored. Show it on, without a way to turn it off.\n required: z.boolean(),\n // Whether the user gets this category now, \"unsubscribe from all\" included.\n subscribed: z.boolean(),\n })\n .strict();\nexport type EmailCategoryState = z.infer<typeof emailCategoryStateSchema>;\n\nexport const emailPreferencesStateSchema = z\n .object({\n // In display order; archived categories are left out.\n categories: z.array(emailCategoryStateSchema),\n unsubscribedAll: z.boolean(),\n })\n .strict();\nexport type EmailPreferencesState = z.infer<typeof emailPreferencesStateSchema>;\n\n/**\n * What the page a link opens shows on top of the state: whose preferences they\n * are, without the full address, and the category the link was for, if any.\n */\nexport const emailPreferencesByTokenStateSchema = z\n .object({\n ...emailPreferencesStateSchema.shape,\n maskedEmail: z.string(),\n // The link's category, when it is one the user can unsubscribe from: null\n // for a link without one, or for an archived, required or unknown one.\n highlightCategory: z.string().nullable(),\n })\n .strict();\nexport type EmailPreferencesByTokenState = z.infer<typeof emailPreferencesByTokenStateSchema>;\n\nconst emailPreferencesChangesShape = {\n // Subscribes (true) or unsubscribes (false) the categories it names, and\n // leaves the rest alone. Subscribing to one after \"unsubscribe from all\"\n // ends it, and every other category stays unsubscribed. A required category\n // is ignored.\n categories: z.record(emailCategoryKeySchema, z.boolean()).optional(),\n // true unsubscribes from every category but the required ones, including\n // categories added later; false ends that and leaves each category as it was\n // before.\n unsubscribedAll: z.boolean().optional(),\n};\n\nexport const emailPreferencesGetInputSchema = z\n .object({\n locale: appLocaleSchema,\n })\n .strict();\nexport type EmailPreferencesGetInput = z.infer<typeof emailPreferencesGetInputSchema>;\n\nexport const emailPreferencesUpdateInputSchema = z\n .object({\n locale: appLocaleSchema,\n ...emailPreferencesChangesShape,\n })\n .strict();\nexport type EmailPreferencesUpdateInput = z.infer<typeof emailPreferencesUpdateInputSchema>;\n\nexport const emailPreferencesGetByTokenInputSchema = z\n .object({\n token: emailLinkTokenSchema,\n locale: appLocaleSchema,\n })\n .strict();\nexport type EmailPreferencesGetByTokenInput = z.infer<typeof emailPreferencesGetByTokenInputSchema>;\n\nexport const emailPreferencesUpdateByTokenInputSchema = z\n .object({\n token: emailLinkTokenSchema,\n locale: appLocaleSchema,\n ...emailPreferencesChangesShape,\n })\n .strict();\nexport type EmailPreferencesUpdateByTokenInput = z.infer<\n typeof emailPreferencesUpdateByTokenInputSchema\n>;\n","import { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n emailPreferencesByTokenStateSchema,\n emailPreferencesGetByTokenInputSchema,\n emailPreferencesGetInputSchema,\n emailPreferencesStateSchema,\n emailPreferencesUpdateByTokenInputSchema,\n emailPreferencesUpdateInputSchema,\n} from \"#/schemas/email-preferences\";\n\n// Every write returns the whole state, so a client can update optimistically\n// and then take the server's answer.\nexport const emailPreferencesContract = {\n get: oc\n .route({\n method: \"GET\",\n path: \"/users/me/email-preferences\",\n summary: \"Get which emails the authenticated user receives\",\n tags: [\"Email preferences\"],\n })\n .input(emailPreferencesGetInputSchema)\n .output(emailPreferencesStateSchema),\n update: oc\n .route({\n method: \"PATCH\",\n path: \"/users/me/email-preferences\",\n summary: \"Change which emails the authenticated user receives\",\n tags: [\"Email preferences\"],\n })\n .input(emailPreferencesUpdateInputSchema)\n .output(emailPreferencesStateSchema),\n // Public: the token in an email's link stands in for signing in. POST keeps\n // the token out of URLs and logs.\n getByToken: oc\n .route({\n method: \"POST\",\n path: \"/email-preferences/by-token\",\n summary: \"Get the email preferences an email link is for\",\n tags: [\"Email preferences\"],\n })\n .errors(pickPublicErrorMap(\"EMAIL_LINK_INVALID\"))\n .input(emailPreferencesGetByTokenInputSchema)\n .output(emailPreferencesByTokenStateSchema),\n updateByToken: oc\n .route({\n method: \"POST\",\n path: \"/email-preferences/by-token/update\",\n summary: \"Change the email preferences an email link is for\",\n tags: [\"Email preferences\"],\n })\n .errors(pickPublicErrorMap(\"EMAIL_LINK_INVALID\"))\n .input(emailPreferencesUpdateByTokenInputSchema)\n .output(emailPreferencesByTokenStateSchema),\n};\n","import { GATED_FEATURE_KEYS } from \"@read-frog/definitions\";\nimport { z } from \"zod\";\n\nexport const GatedFeatureKeySchema = z.enum(GATED_FEATURE_KEYS);\nexport type GatedFeatureKey = z.infer<typeof GatedFeatureKeySchema>;\n\nexport const FeatureAccessStatusInputSchema = z\n .object({\n featureKey: GatedFeatureKeySchema,\n })\n .strict();\nexport type FeatureAccessStatusInput = z.infer<typeof FeatureAccessStatusInputSchema>;\n\nexport const FeatureAccessStatusOutputSchema = z.object({\n featureKey: GatedFeatureKeySchema,\n allowed: z.boolean(),\n});\nexport type FeatureAccessStatusOutput = z.infer<typeof FeatureAccessStatusOutputSchema>;\n","import { oc } from \"@orpc/contract\";\nimport {\n FeatureAccessStatusInputSchema,\n FeatureAccessStatusOutputSchema,\n} from \"#/schemas/feature-access\";\n\nexport const featureAccessContract = {\n status: oc\n .route({\n method: \"GET\",\n path: \"/feature-access/status\",\n summary: \"Get whether the caller can use a gated feature\",\n tags: [\"Feature Access\"],\n })\n .input(FeatureAccessStatusInputSchema)\n .output(FeatureAccessStatusOutputSchema),\n};\n","import { eventIterator, oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n HostedAiNoteSuggestionStreamInputSchema,\n HostedAiStatusInputSchema,\n HostedAiStatusOutputSchema,\n HostedAiStreamPartSchema,\n HostedAiStreamStructuredObjectInputSchema,\n HostedAiStreamTextInputSchema,\n} from \"#/schemas/hosted-ai\";\n\nconst hostedAiStreamErrors = pickPublicErrorMap(\n \"HOSTED_AI_TIER_RESTRICTED\",\n \"HOSTED_AI_QUOTA_EXHAUSTED\",\n);\n\nexport const hostedAiContract = {\n status: oc\n .route({\n method: \"GET\",\n path: \"/hosted-ai/status\",\n summary: \"Get Built-in AI availability and quota status\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStatusInputSchema)\n .output(HostedAiStatusOutputSchema),\n translate: {\n streamText: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/translate/stream-text\",\n summary: \"Stream hosted translation text output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStreamTextInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n },\n selectionTranslation: {\n streamText: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/selection-translation/stream-text\",\n summary: \"Stream hosted selection translation text output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStreamTextInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n },\n videoSubtitles: {\n // Subtitle lines and the video summary share this route: both are short\n // text and both bill against `videoSubtitles`.\n streamText: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/video-subtitles/stream-text\",\n summary: \"Stream hosted subtitle translation or video summary text output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStreamTextInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n /**\n * Segmentation shares the `videoSubtitles` feature but not its route,\n * because `endpointMaxOutputTokens` sizes the credit reservation: emitting\n * a WebVTT block needs several times a subtitle line's budget, and folding\n * both into one route would make every line reserve — and, near the end of\n * a credit window, fail to afford — what only segmentation needs.\n */\n streamSegmentation: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/video-subtitles/stream-segmentation\",\n summary: \"Stream hosted subtitle segmentation output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStreamTextInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n },\n inputTranslation: {\n streamText: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/input-translation/stream-text\",\n summary: \"Stream hosted input box translation text output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStreamTextInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n },\n languageDetection: {\n // Detection wants one short string back, not a stream, but the quota\n // reserve/settle path is stream-shaped end to end. Reusing it keeps one\n // metering implementation; the client collects the deltas.\n streamText: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/language-detection/stream-text\",\n summary: \"Stream hosted language detection output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStreamTextInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n },\n customAction: {\n streamStructuredObject: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/custom-actions/stream-structured-object\",\n summary: \"Stream hosted custom action structured output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiStreamStructuredObjectInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n },\n noteSuggestion: {\n streamStructuredObject: oc\n .route({\n method: \"POST\",\n path: \"/hosted-ai/note-suggestions/stream-structured-object\",\n summary: \"Stream hosted note suggestion structured output\",\n tags: [\"Hosted AI\"],\n })\n .input(HostedAiNoteSuggestionStreamInputSchema)\n .output(eventIterator(HostedAiStreamPartSchema))\n .errors(hostedAiStreamErrors),\n },\n};\n","import { z } from \"zod\";\n\nexport const MASTERY_GOAL_TARGET_MAX = 1_000_000;\n\n/** How many mastered cards to aim for: the cards `stats.srsMemoryGrowth` counts. */\nexport const masteryGoalTargetSchema = z.number().int().min(1).max(MASTERY_GOAL_TARGET_MAX);\nexport type MasteryGoalTarget = z.infer<typeof masteryGoalTargetSchema>;\n\n/** `null` clears the goal. */\nexport const masteryGoalUpdateInputSchema = z\n .object({\n target: masteryGoalTargetSchema.nullable(),\n })\n .strict();\nexport type MasteryGoalUpdateInput = z.infer<typeof masteryGoalUpdateInputSchema>;\n\n/** The goal's target, or `null` while none is set. */\nexport const masteryGoalOutputSchema = z\n .object({\n target: masteryGoalTargetSchema.nullable(),\n })\n .strict();\nexport type MasteryGoalOutput = z.infer<typeof masteryGoalOutputSchema>;\n","import { oc } from \"@orpc/contract\";\nimport { masteryGoalOutputSchema, masteryGoalUpdateInputSchema } from \"#/schemas/mastery-goal\";\n\nexport const masteryGoalContract = {\n get: oc\n .route({\n method: \"GET\",\n path: \"/mastery-goal\",\n summary: \"Get the authenticated user's mastered-cards goal\",\n tags: [\"Goals\"],\n })\n .output(masteryGoalOutputSchema),\n update: oc\n .route({\n method: \"PUT\",\n path: \"/mastery-goal\",\n summary: \"Set or clear the authenticated user's mastered-cards goal\",\n tags: [\"Goals\"],\n })\n .input(masteryGoalUpdateInputSchema)\n .output(masteryGoalOutputSchema),\n};\n","import { z } from \"zod\";\n\nexport const mcpConnectionSchema = z\n .object({\n /** OAuth client identifier. For a CIMD client this is an https URL. */\n clientId: z.string(),\n /** The client's registered display name, absent when it never gave one. */\n clientName: z.string().nullable(),\n scopes: z.array(z.string()),\n requestedUserInfoClaims: z.array(z.string()),\n grantedAt: z.date().nullable(),\n updatedAt: z.date().nullable(),\n /**\n * When this client last obtained an access token — the closest honest\n * proxy for \"last used\" the OAuth tables record. A token is issued on\n * connect and on every refresh, so an idle client's value stops advancing.\n */\n lastAuthorizedAt: z.date().nullable(),\n })\n .strict();\nexport type McpConnection = z.infer<typeof mcpConnectionSchema>;\n\nexport const mcpConnectionListOutputSchema = z.array(mcpConnectionSchema);\n\nexport const mcpConnectionRevokeInputSchema = z.object({ clientId: z.string().min(1) }).strict();\nexport type McpConnectionRevokeInput = z.infer<typeof mcpConnectionRevokeInputSchema>;\n\nexport const mcpConnectionRevokeOutputSchema = z.object({ clientId: z.string() }).strict();\n","import { oc } from \"@orpc/contract\";\nimport {\n mcpConnectionListOutputSchema,\n mcpConnectionRevokeInputSchema,\n mcpConnectionRevokeOutputSchema,\n} from \"#/schemas/mcp-connection\";\n\nexport const mcpConnectionContract = {\n list: oc\n .route({\n method: \"GET\",\n path: \"/mcp-connections\",\n summary: \"List the OAuth clients the caller has authorized\",\n tags: [\"MCP Connections\"],\n })\n .output(mcpConnectionListOutputSchema),\n revoke: oc\n .route({\n method: \"POST\",\n path: \"/mcp-connections/revoke\",\n summary: \"Withdraw a client's authorization and revoke its tokens\",\n tags: [\"MCP Connections\"],\n })\n .input(mcpConnectionRevokeInputSchema)\n .output(mcpConnectionRevokeOutputSchema),\n};\n","import { deletionResultSchema, expectedUpdatedAtSchema } from \"./resource-mutation\";\nimport {\n NOTEBASE_COLUMN_MAX_WIDTH,\n NOTEBASE_COLUMN_MIN_WIDTH,\n notebaseColumnConfigSchema,\n} from \"@read-frog/definitions\";\nimport { z } from \"zod\";\n\nexport const notebaseColumnWidthSchema = z\n .number()\n .int()\n .min(NOTEBASE_COLUMN_MIN_WIDTH)\n .max(NOTEBASE_COLUMN_MAX_WIDTH);\n\nexport const notebaseColumnSchema = z.object({\n id: z.string(),\n notebaseId: z.string(),\n name: z.string(),\n config: notebaseColumnConfigSchema,\n position: z.number(),\n isPrimary: z.boolean(),\n width: z.number().nullable(),\n wrap: z.boolean(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\nexport type NotebaseColumn = z.infer<typeof notebaseColumnSchema>;\n\nexport const notebaseColumnCreateDataSchema = z\n .object({\n id: z.uuid().optional(),\n name: z.string().min(1),\n config: notebaseColumnConfigSchema,\n })\n .strict();\nexport type NotebaseColumnCreateData = z.infer<typeof notebaseColumnCreateDataSchema>;\n\nexport const notebaseColumnUpdateDataSchema = z\n .object({\n expectedUpdatedAt: expectedUpdatedAtSchema.optional(),\n name: z.string().min(1).optional(),\n config: notebaseColumnConfigSchema.optional(),\n width: notebaseColumnWidthSchema.nullable().optional(),\n wrap: z.boolean().optional(),\n })\n .strict();\nexport type NotebaseColumnUpdateData = z.infer<typeof notebaseColumnUpdateDataSchema>;\n\nexport const NotebaseColumnCreateInputSchema = z.object({\n notebaseId: z.uuid(),\n data: notebaseColumnCreateDataSchema,\n});\nexport type NotebaseColumnCreateInput = z.infer<typeof NotebaseColumnCreateInputSchema>;\n\nexport const NotebaseColumnCreateOutputSchema = z.object({\n field: notebaseColumnSchema,\n txid: z.number(),\n});\nexport type NotebaseColumnCreateOutput = z.infer<typeof NotebaseColumnCreateOutputSchema>;\n\nexport const NotebaseColumnUpdateInputSchema = z.object({\n notebaseColumnId: z.uuid(),\n data: notebaseColumnUpdateDataSchema,\n});\nexport type NotebaseColumnUpdateInput = z.infer<typeof NotebaseColumnUpdateInputSchema>;\n\nexport const NotebaseColumnUpdateOutputSchema = z.object({\n field: notebaseColumnSchema,\n txid: z.number(),\n});\nexport type NotebaseColumnUpdateOutput = z.infer<typeof NotebaseColumnUpdateOutputSchema>;\n\nexport const NotebaseColumnDeleteInputSchema = z.object({\n notebaseColumnId: z.uuid(),\n});\nexport type NotebaseColumnDeleteInput = z.infer<typeof NotebaseColumnDeleteInputSchema>;\n\nexport const NotebaseColumnDeleteOutputSchema = deletionResultSchema;\nexport type NotebaseColumnDeleteOutput = z.infer<typeof NotebaseColumnDeleteOutputSchema>;\n\nexport const NotebaseColumnReorderInputSchema = z.object({\n notebaseId: z.uuid(),\n ids: z.array(z.uuid()),\n});\nexport type NotebaseColumnReorderInput = z.infer<typeof NotebaseColumnReorderInputSchema>;\n\nexport const NotebaseColumnReorderOutputSchema = z.object({\n txid: z.number(),\n});\nexport type NotebaseColumnReorderOutput = z.infer<typeof NotebaseColumnReorderOutputSchema>;\n","import { paginationShape, pageSchema } from \"./pagination\";\nimport { deletionResultSchema, expectedUpdatedAtSchema } from \"./resource-mutation\";\nimport { z } from \"zod\";\n\nexport const notebaseRowCellsSchema = z.record(z.string(), z.unknown());\n\nexport const notebaseRowSchema = z.object({\n id: z.string(),\n notebaseId: z.string(),\n cells: notebaseRowCellsSchema,\n position: z.number(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\nexport type NotebaseRow = z.infer<typeof notebaseRowSchema>;\n\nexport const notebaseRowCreateDataSchema = z\n .object({\n id: z.uuid().optional(),\n cells: notebaseRowCellsSchema.optional(),\n })\n .strict();\nexport type NotebaseRowCreateData = z.infer<typeof notebaseRowCreateDataSchema>;\n\nexport const notebaseRowUpdateDataSchema = z\n .object({\n cells: notebaseRowCellsSchema.optional(),\n expectedUpdatedAt: expectedUpdatedAtSchema.optional(),\n })\n .strict();\nexport type NotebaseRowUpdateData = z.infer<typeof notebaseRowUpdateDataSchema>;\n\nexport const NotebaseRowCreateInputSchema = z.object({\n notebaseId: z.uuid(),\n data: notebaseRowCreateDataSchema,\n});\nexport type NotebaseRowCreateInput = z.infer<typeof NotebaseRowCreateInputSchema>;\n\nexport const NotebaseRowCreateOutputSchema = z.object({\n note: notebaseRowSchema,\n txid: z.number(),\n});\nexport type NotebaseRowCreateOutput = z.infer<typeof NotebaseRowCreateOutputSchema>;\n\nexport const NOTEBASE_ROW_CREATE_MANY_MAX_ROWS = 50;\n\nexport const NotebaseRowCreateManyInputSchema = z\n .object({\n notebaseId: z.uuid(),\n rows: z.array(notebaseRowCreateDataSchema).min(1).max(NOTEBASE_ROW_CREATE_MANY_MAX_ROWS),\n })\n .superRefine((input, ctx) => {\n const seenIds = new Set<string>();\n\n input.rows.forEach((row, index) => {\n if (row.id === undefined) {\n return;\n }\n\n if (seenIds.has(row.id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Duplicate row id \"${row.id}\".`,\n path: [\"rows\", index, \"id\"],\n });\n return;\n }\n\n seenIds.add(row.id);\n });\n });\nexport type NotebaseRowCreateManyInput = z.infer<typeof NotebaseRowCreateManyInputSchema>;\n\nexport const NotebaseRowCreateManyOutputSchema = z.object({\n items: z.array(notebaseRowSchema),\n txid: z.number(),\n});\nexport type NotebaseRowCreateManyOutput = z.infer<typeof NotebaseRowCreateManyOutputSchema>;\n\nexport const NotebaseRowUpdateInputSchema = z.object({\n notebaseRowId: z.uuid(),\n data: notebaseRowUpdateDataSchema,\n});\nexport type NotebaseRowUpdateInput = z.infer<typeof NotebaseRowUpdateInputSchema>;\n\nexport const NotebaseRowUpdateOutputSchema = z.object({\n id: z.uuid(),\n notebaseId: z.uuid(),\n cells: notebaseRowCellsSchema,\n position: z.number().int(),\n createdAt: z.date(),\n updatedAt: z.date(),\n txid: z.number(),\n});\nexport type NotebaseRowUpdateOutput = z.infer<typeof NotebaseRowUpdateOutputSchema>;\n\nexport const NOTEBASE_ROW_UPDATE_MANY_MAX_ROWS = 50;\n\nexport const NotebaseRowUpdateManyInputSchema = z\n .object({\n notebaseId: z.uuid(),\n rows: z\n .array(\n z.object({\n id: z.uuid(),\n data: notebaseRowUpdateDataSchema,\n }),\n )\n .min(1)\n .max(NOTEBASE_ROW_UPDATE_MANY_MAX_ROWS),\n })\n .superRefine((input, ctx) => {\n const seenIds = new Set<string>();\n input.rows.forEach((row, index) => {\n if (seenIds.has(row.id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Duplicate row id \"${row.id}\".`,\n path: [\"rows\", index, \"id\"],\n });\n }\n seenIds.add(row.id);\n });\n });\nexport type NotebaseRowUpdateManyInput = z.infer<typeof NotebaseRowUpdateManyInputSchema>;\n\nexport const NotebaseRowUpdateManyOutputSchema = z.object({\n items: z.array(notebaseRowSchema),\n txid: z.number(),\n});\nexport type NotebaseRowUpdateManyOutput = z.infer<typeof NotebaseRowUpdateManyOutputSchema>;\n\nexport const NotebaseRowDeleteInputSchema = z.object({\n notebaseRowId: z.uuid(),\n});\nexport type NotebaseRowDeleteInput = z.infer<typeof NotebaseRowDeleteInputSchema>;\n\nexport const NotebaseRowDeleteOutputSchema = deletionResultSchema;\nexport type NotebaseRowDeleteOutput = z.infer<typeof NotebaseRowDeleteOutputSchema>;\n\nexport const NOTEBASE_ROW_DELETE_MANY_MAX_ROWS = 50;\n\nexport const NotebaseRowDeleteManyInputSchema = z\n .object({\n ids: z.array(z.uuid()).min(1).max(NOTEBASE_ROW_DELETE_MANY_MAX_ROWS),\n })\n .superRefine((input, ctx) => {\n const seenIds = new Set<string>();\n input.ids.forEach((id, index) => {\n if (seenIds.has(id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Duplicate row id \"${id}\".`,\n path: [\"ids\", index],\n });\n }\n seenIds.add(id);\n });\n });\nexport type NotebaseRowDeleteManyInput = z.infer<typeof NotebaseRowDeleteManyInputSchema>;\n\nexport const NotebaseRowDeleteManyOutputSchema = z.object({ ids: z.array(z.uuid()) });\nexport type NotebaseRowDeleteManyOutput = z.infer<typeof NotebaseRowDeleteManyOutputSchema>;\n\nexport const NotebaseRowReorderInputSchema = z.object({\n notebaseId: z.uuid(),\n ids: z.array(z.uuid()),\n});\nexport type NotebaseRowReorderInput = z.infer<typeof NotebaseRowReorderInputSchema>;\n\nexport const NotebaseRowReorderOutputSchema = z.object({\n txid: z.number(),\n});\nexport type NotebaseRowReorderOutput = z.infer<typeof NotebaseRowReorderOutputSchema>;\n\nexport const NotebaseRowListInputSchema = z\n .object({\n notebaseId: z.uuid().optional(),\n // Two characters is already a meaningful CJK query; one matches nearly\n // every note while costing the same full scan, so the floor is a cost\n // control rather than an ergonomic preference.\n query: z.string().trim().min(2).max(200).optional(),\n ...paginationShape,\n })\n // Listing without a notebase is a plain indexed read. Searching is not: it\n // expands every candidate row's cells and cannot use an index, so it stays\n // scoped to one notebase, where `notebase_rows_notebase_id_idx` bounds the\n // candidate set. Searching everything means iterating over notebases.\n .refine((input) => input.query === undefined || input.notebaseId !== undefined, {\n error: \"notebaseId is required when query is set\",\n path: [\"notebaseId\"],\n });\nexport type NotebaseRowListInput = z.infer<typeof NotebaseRowListInputSchema>;\nexport const NotebaseRowListOutputSchema = pageSchema(notebaseRowSchema);\nexport const NotebaseRowGetInputSchema = z.object({ id: z.uuid() });\nexport const NotebaseRowGetOutputSchema = notebaseRowSchema;\n","import { z } from \"zod\";\n\nexport const notebaseViewTypeSchema = z.enum([\"table\", \"kanban\", \"gallery\"]);\nexport type NotebaseViewType = z.infer<typeof notebaseViewTypeSchema>;\n\nexport const notebaseViewConfigSchema = z\n .object({\n notebaseColumnWidths: z.record(z.string(), z.number()).optional(),\n hiddenNotebaseColumns: z.array(z.string()).optional(),\n groupByNotebaseColumnId: z.string().optional(),\n })\n .catchall(z.unknown());\nexport type NotebaseViewConfig = z.infer<typeof notebaseViewConfigSchema>;\n\nexport const notebaseViewFilterSchema = z\n .object({\n notebaseColumnId: z.string(),\n operator: z.string(),\n value: z.unknown(),\n })\n .strict();\nexport type NotebaseViewFilter = z.infer<typeof notebaseViewFilterSchema>;\n\nexport const notebaseViewFiltersSchema = z.array(notebaseViewFilterSchema);\n\nexport const notebaseViewSortSchema = z\n .object({\n notebaseColumnId: z.string(),\n direction: z.enum([\"asc\", \"desc\"]),\n })\n .strict();\nexport type NotebaseViewSort = z.infer<typeof notebaseViewSortSchema>;\n\nexport const notebaseViewSortsSchema = z.array(notebaseViewSortSchema);\n\nexport const notebaseViewCreateDataSchema = z\n .object({\n id: z.uuid().optional(),\n name: z.string().min(1),\n type: notebaseViewTypeSchema,\n config: notebaseViewConfigSchema.optional(),\n filters: notebaseViewFiltersSchema.optional(),\n sorts: notebaseViewSortsSchema.optional(),\n })\n .strict();\nexport type NotebaseViewCreateData = z.infer<typeof notebaseViewCreateDataSchema>;\n\nexport const notebaseViewUpdateDataSchema = z\n .object({\n name: z.string().min(1).optional(),\n type: notebaseViewTypeSchema.optional(),\n config: notebaseViewConfigSchema.optional(),\n filters: notebaseViewFiltersSchema.optional(),\n sorts: notebaseViewSortsSchema.optional(),\n })\n .strict();\nexport type NotebaseViewUpdateData = z.infer<typeof notebaseViewUpdateDataSchema>;\n\nexport const notebaseViewSchema = z.object({\n id: z.string(),\n notebaseId: z.string(),\n name: z.string(),\n type: notebaseViewTypeSchema,\n config: notebaseViewConfigSchema.nullable(),\n filters: z.array(z.unknown()).nullable(),\n sorts: z.array(z.unknown()).nullable(),\n position: z.number(),\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n});\nexport type NotebaseView = z.infer<typeof notebaseViewSchema>;\n","import { deletionResultSchema } from \"./resource-mutation\";\nimport {\n notebaseColumnConfigSchema,\n schedulingParamsShape,\n srsModelVersionSchema,\n srsWeightsSchema,\n} from \"@read-frog/definitions\";\nimport { z } from \"zod\";\nimport { notebaseColumnSchema } from \"./notebase-column\";\nimport { NOTEBASE_ROW_CREATE_MANY_MAX_ROWS, notebaseRowSchema } from \"./notebase-row\";\nimport { notebaseViewSchema } from \"./notebase-view\";\n\nexport const NotebaseListInputSchema = z.object({});\nexport type NotebaseListInput = z.infer<typeof NotebaseListInputSchema>;\n\nexport const notebaseSummarySchema = z.object({\n id: z.string(),\n name: z.string(),\n});\nexport type NotebaseSummary = z.infer<typeof notebaseSummarySchema>;\n\nexport const NotebaseListItemSchema = notebaseSummarySchema;\nexport type NotebaseListItem = z.infer<typeof NotebaseListItemSchema>;\n\nexport const NotebaseListOutputSchema = z.array(NotebaseListItemSchema);\nexport type NotebaseListOutput = z.infer<typeof NotebaseListOutputSchema>;\n\nexport const notebaseSchema = z.object({\n id: z.string(),\n userId: z.string(),\n name: z.string(),\n srsNewPerDay: schedulingParamsShape.newPerDay,\n srsReviewsPerDay: schedulingParamsShape.reviewsPerDay,\n srsDesiredRetention: schedulingParamsShape.desiredRetention,\n srsEnableShortTerm: schedulingParamsShape.enableShortTerm,\n srsMaximumInterval: schedulingParamsShape.maximumInterval,\n srsLearningSteps: schedulingParamsShape.learningSteps,\n srsRelearningSteps: schedulingParamsShape.relearningSteps,\n srsLeechThreshold: schedulingParamsShape.leechThreshold,\n srsEnableFuzz: schedulingParamsShape.enableFuzz,\n srsWeights: srsWeightsSchema.nullable(),\n // Selects the scheduler/curve; read-only, changed only by the FSRS-7 migration.\n srsModelVersion: srsModelVersionSchema,\n // Null = awake; set = excluded from the combined review. Written by notebase.setSleep and auto sleep.\n srsSleepingAt: z.date().nullable(),\n createdAt: z.date(),\n updatedAt: z.date(),\n});\nexport type Notebase = z.infer<typeof notebaseSchema>;\n\nconst notebaseInitialRowSchema = z\n .object({\n id: z.uuid().optional(),\n cells: z.record(z.string(), z.unknown()),\n })\n .strict();\n\nexport const notebaseCreateDataSchema = z\n .object({\n id: z.uuid().optional(),\n name: z.string().min(1),\n options: z\n .object({\n initialColumns: z\n .array(\n z\n .object({\n id: z.uuid(),\n name: z.string().min(1),\n config: notebaseColumnConfigSchema,\n })\n .strict(),\n )\n .min(1),\n initialRow: notebaseInitialRowSchema.optional(),\n initialRows: z\n .array(notebaseInitialRowSchema)\n .min(1)\n .max(NOTEBASE_ROW_CREATE_MANY_MAX_ROWS)\n .optional(),\n })\n .strict()\n .superRefine((options, ctx) => {\n if (options.initialRow && options.initialRows) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Provide either initialRow or initialRows, not both.\",\n path: [\"initialRows\"],\n });\n }\n\n if (!options.initialRows) {\n return;\n }\n\n const seenIds = new Set<string>();\n options.initialRows.forEach((row, index) => {\n if (row.id === undefined) {\n return;\n }\n\n if (seenIds.has(row.id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Duplicate row id \"${row.id}\".`,\n path: [\"initialRows\", index, \"id\"],\n });\n return;\n }\n\n seenIds.add(row.id);\n });\n })\n .optional(),\n })\n .strict();\nexport type NotebaseCreateData = z.infer<typeof notebaseCreateDataSchema>;\n\nexport const NotebaseCreateInputSchema = notebaseCreateDataSchema;\nexport type NotebaseCreateInput = z.infer<typeof NotebaseCreateInputSchema>;\n\nexport const NotebaseCreateOutputSchema = z.object({\n notebase: notebaseSchema,\n txid: z.number(),\n});\nexport type NotebaseCreateOutput = z.infer<typeof NotebaseCreateOutputSchema>;\n\nexport const notebaseUpdateDataSchema = z\n .object({\n name: z.string().min(1).optional(),\n srsNewPerDay: schedulingParamsShape.newPerDay.optional(),\n srsReviewsPerDay: schedulingParamsShape.reviewsPerDay.optional(),\n srsDesiredRetention: schedulingParamsShape.desiredRetention.optional(),\n })\n .strict();\nexport type NotebaseUpdateData = z.infer<typeof notebaseUpdateDataSchema>;\n\nexport const NotebaseUpdateInputSchema = notebaseUpdateDataSchema.extend({\n id: z.uuid(),\n});\nexport type NotebaseUpdateInput = z.infer<typeof NotebaseUpdateInputSchema>;\n\nexport const NotebaseUpdateOutputSchema = z.object({\n notebase: notebaseSchema,\n txid: z.number(),\n});\nexport type NotebaseUpdateOutput = z.infer<typeof NotebaseUpdateOutputSchema>;\n\nexport const NotebaseSetSleepInputSchema = z\n .object({\n id: z.uuid(),\n enabled: z.boolean(),\n })\n .strict();\nexport type NotebaseSetSleepInput = z.infer<typeof NotebaseSetSleepInputSchema>;\n\n// txid is null when the notebase was already in the requested state: nothing to wait for.\nexport const NotebaseSetSleepOutputSchema = z.object({\n txid: z.number().nullable(),\n});\nexport type NotebaseSetSleepOutput = z.infer<typeof NotebaseSetSleepOutputSchema>;\n\nexport const NotebaseDeleteInputSchema = z.object({\n id: z.uuid(),\n});\nexport type NotebaseDeleteInput = z.infer<typeof NotebaseDeleteInputSchema>;\n\nexport const NotebaseDeleteOutputSchema = deletionResultSchema;\nexport type NotebaseDeleteOutput = z.infer<typeof NotebaseDeleteOutputSchema>;\n\n// Get endpoint schemas\nexport const NotebaseGetInputSchema = z.object({\n id: z.uuid(),\n});\nexport type NotebaseGetInput = z.infer<typeof NotebaseGetInputSchema>;\n\nexport const NotebaseGetSummaryInputSchema = z.object({\n id: z.uuid(),\n});\nexport type NotebaseGetSummaryInput = z.infer<typeof NotebaseGetSummaryInputSchema>;\n\nexport const NotebaseGetSummaryOutputSchema = notebaseSummarySchema.extend({\n srsNewPerDay: schedulingParamsShape.newPerDay,\n srsReviewsPerDay: schedulingParamsShape.reviewsPerDay,\n srsDesiredRetention: schedulingParamsShape.desiredRetention,\n noteCount: z.number().int().nonnegative(),\n});\nexport type NotebaseGetSummaryOutput = z.infer<typeof NotebaseGetSummaryOutputSchema>;\n\nexport const NotebaseGetSchemaInputSchema = z.object({\n id: z.uuid(),\n});\nexport type NotebaseGetSchemaInput = z.infer<typeof NotebaseGetSchemaInputSchema>;\n\nexport const NotebaseGetOutputSchema = notebaseSchema.extend({\n createdAt: z.coerce.date(),\n updatedAt: z.coerce.date(),\n notebaseColumns: z.array(notebaseColumnSchema),\n notebaseRows: z.array(notebaseRowSchema),\n notebaseViews: z.array(notebaseViewSchema),\n});\nexport type NotebaseGetOutput = z.infer<typeof NotebaseGetOutputSchema>;\n\nexport const NotebaseGetSchemaOutputSchema = z.object({\n id: z.string(),\n name: z.string(),\n updatedAt: z.coerce.date(),\n notebaseColumns: z.array(notebaseColumnSchema),\n});\nexport type NotebaseGetSchemaOutput = z.infer<typeof NotebaseGetSchemaOutputSchema>;\n","import { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n NotebaseCreateInputSchema,\n NotebaseCreateOutputSchema,\n NotebaseDeleteInputSchema,\n NotebaseDeleteOutputSchema,\n NotebaseGetInputSchema,\n NotebaseGetOutputSchema,\n NotebaseGetSchemaInputSchema,\n NotebaseGetSchemaOutputSchema,\n NotebaseGetSummaryInputSchema,\n NotebaseGetSummaryOutputSchema,\n NotebaseListInputSchema,\n NotebaseListOutputSchema,\n NotebaseSetSleepInputSchema,\n NotebaseSetSleepOutputSchema,\n NotebaseUpdateInputSchema,\n NotebaseUpdateOutputSchema,\n} from \"#/schemas/notebase\";\nimport { defineAgentProcedure } from \"./shared\";\n\nexport const notebaseContract = {\n list: defineAgentProcedure({\n method: \"GET\",\n path: \"/notebases\",\n summary: \"List notebases\",\n description: \"List the notebases (word books) owned by the current user.\",\n tags: [\"Notebases\"],\n })\n .input(NotebaseListInputSchema)\n .output(NotebaseListOutputSchema),\n\n getSummary: defineAgentProcedure({\n method: \"GET\",\n path: \"/notebases/{id}/summary\",\n summary: \"Get notebase summary\",\n description:\n \"Read the name, public study settings and note count of an owned notebase without loading note content.\",\n tags: [\"Notebases\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(NotebaseGetSummaryInputSchema)\n .output(NotebaseGetSummaryOutputSchema),\n\n get: oc\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .route({\n method: \"GET\",\n path: \"/notebases/{id}\",\n summary: \"Get notebase with notebase columns, rows, and views\",\n tags: [\"Notebases\"],\n })\n .input(NotebaseGetInputSchema)\n .output(NotebaseGetOutputSchema),\n\n getSchema: defineAgentProcedure({\n method: \"GET\",\n path: \"/notebases/{id}/schema\",\n summary: \"Get notebase schema\",\n description:\n \"Read an owned notebase name and field definitions, including field IDs, types and updatedAt timestamps. Does not return note content.\",\n tags: [\"Notebases\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(NotebaseGetSchemaInputSchema)\n .output(NotebaseGetSchemaOutputSchema),\n\n create: defineAgentProcedure({\n method: \"POST\",\n path: \"/notebases\",\n summary: \"Create notebase\",\n description:\n \"Create an owned notebase with optional initial fields and notes. Client-provided entity IDs are supported; duplicate IDs produce a conflict.\",\n tags: [\"Notebases\"],\n })\n .errors(pickPublicErrorMap(\"NOTE_LIMIT_EXCEEDED\", \"CELL_VALIDATION_FAILED\"))\n .errors(pickPublicErrorMap(\"RESOURCE_ALREADY_EXISTS\"))\n .input(NotebaseCreateInputSchema)\n .output(NotebaseCreateOutputSchema),\n\n update: defineAgentProcedure({\n method: \"PUT\",\n path: \"/notebases/{id}\",\n summary: \"Update notebase\",\n description:\n \"Update the supplied name or public study settings of an owned notebase, preserving omitted properties.\",\n tags: [\"Notebases\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(NotebaseUpdateInputSchema)\n .output(NotebaseUpdateOutputSchema),\n\n setSleep: defineAgentProcedure({\n method: \"POST\",\n path: \"/notebases/{id}/sleep\",\n summary: \"Set notebase sleep\",\n description:\n \"Put an owned notebase to sleep (enabled=true) or wake it (enabled=false). A sleeping notebase is left out of the combined review; its cards, memory states and review history are unchanged and it can still be reviewed directly. A request matching the current state succeeds without a change.\",\n tags: [\"Notebases\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(NotebaseSetSleepInputSchema)\n .output(NotebaseSetSleepOutputSchema),\n\n delete: defineAgentProcedure({\n method: \"DELETE\",\n path: \"/notebases/{id}\",\n summary: \"Delete notebase\",\n description:\n \"Permanently delete an owned notebase and its fields, notes, templates, cards and review records. Return the deleted notebase ID.\",\n tags: [\"Notebases\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(NotebaseDeleteInputSchema)\n .output(NotebaseDeleteOutputSchema),\n};\n","import { defineAgentProcedure } from \"./shared\";\nimport { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n NotebaseColumnCreateInputSchema,\n NotebaseColumnCreateOutputSchema,\n NotebaseColumnDeleteInputSchema,\n NotebaseColumnDeleteOutputSchema,\n NotebaseColumnReorderInputSchema,\n NotebaseColumnReorderOutputSchema,\n NotebaseColumnUpdateInputSchema,\n NotebaseColumnUpdateOutputSchema,\n} from \"#/schemas/notebase-column\";\n\nexport const notebaseColumnContract = {\n create: defineAgentProcedure({\n method: \"POST\",\n path: \"/notebase-columns\",\n summary: \"Create notebase field\",\n description:\n \"Create a field in an owned notebase. The returned field ID is used as a key in note cells.\",\n tags: [\"Notebase Columns\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\", \"CONCURRENT_POSITION_CONFLICT\"))\n .errors(pickPublicErrorMap(\"RESOURCE_ALREADY_EXISTS\"))\n .input(NotebaseColumnCreateInputSchema)\n .output(NotebaseColumnCreateOutputSchema),\n\n update: defineAgentProcedure({\n method: \"PATCH\",\n path: \"/notebase-columns/{notebaseColumnId}\",\n summary: \"Update notebase field\",\n description:\n \"Update an owned field without changing its type. Removing select options clears affected note values. expectedUpdatedAt guards against editing stale data.\",\n tags: [\"Notebase Columns\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_COLUMN_NOT_FOUND\"))\n .errors(pickPublicErrorMap(\"RESOURCE_UPDATE_CONFLICT\", \"FIELD_TYPE_CHANGE_UNSUPPORTED\"))\n .input(NotebaseColumnUpdateInputSchema)\n .output(NotebaseColumnUpdateOutputSchema),\n\n delete: defineAgentProcedure({\n method: \"DELETE\",\n path: \"/notebase-columns/{notebaseColumnId}\",\n summary: \"Delete notebase field\",\n description:\n \"Delete an owned field and remove its values from notes. Primary fields and fields referenced by templates cannot be deleted.\",\n tags: [\"Notebase Columns\"],\n })\n .errors(\n pickPublicErrorMap(\n \"NOTEBASE_COLUMN_NOT_FOUND\",\n \"PRIMARY_NOTEBASE_COLUMN_DELETE_NOT_ALLOWED\",\n \"CARD_TEMPLATE_NOTEBASE_COLUMN_IN_USE\",\n \"CONCURRENT_POSITION_CONFLICT\",\n ),\n )\n .input(NotebaseColumnDeleteInputSchema)\n .output(NotebaseColumnDeleteOutputSchema),\n\n reorder: oc\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\", \"CONCURRENT_POSITION_CONFLICT\"))\n .route({\n method: \"POST\",\n path: \"/notebase-columns/reorder\",\n summary: \"Reorder notebase columns\",\n tags: [\"Notebase Columns\"],\n })\n .input(NotebaseColumnReorderInputSchema)\n .output(NotebaseColumnReorderOutputSchema),\n};\n","import { defineAgentProcedure } from \"./shared\";\nimport {\n NotebaseRowListInputSchema,\n NotebaseRowListOutputSchema,\n NotebaseRowGetInputSchema,\n NotebaseRowGetOutputSchema,\n} from \"#/schemas/notebase-row\";\nimport { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n NotebaseRowCreateInputSchema,\n NotebaseRowCreateManyInputSchema,\n NotebaseRowCreateManyOutputSchema,\n NotebaseRowCreateOutputSchema,\n NotebaseRowDeleteInputSchema,\n NotebaseRowDeleteManyInputSchema,\n NotebaseRowDeleteManyOutputSchema,\n NotebaseRowDeleteOutputSchema,\n NotebaseRowReorderInputSchema,\n NotebaseRowReorderOutputSchema,\n NotebaseRowUpdateInputSchema,\n NotebaseRowUpdateManyInputSchema,\n NotebaseRowUpdateManyOutputSchema,\n NotebaseRowUpdateOutputSchema,\n} from \"#/schemas/notebase-row\";\n\nexport const notebaseRowContract = {\n list: defineAgentProcedure({\n method: \"GET\",\n path: \"/notebase-rows\",\n summary: \"List or search notes\",\n description:\n \"List or search owned notes, optionally within one notebase. Supply query to search; omit it to browse, which returns every note in scope rather than a filtered set. Searching requires notebaseId and covers that one notebase, so cover several by listing them first and calling this once per notebase. The query filter is at least two characters, matches a literal case-insensitive substring, and only searches fields of type string, so values in number, boolean, date and select fields are never matched. Supports limit and offset pagination.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(NotebaseRowListInputSchema)\n .output(NotebaseRowListOutputSchema),\n get: defineAgentProcedure({\n method: \"GET\",\n path: \"/notebase-rows/{id}\",\n summary: \"Get note\",\n description:\n \"Read one owned note with field-ID values and the updatedAt timestamp used for modification checks.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_ROW_NOT_FOUND\"))\n .input(NotebaseRowGetInputSchema)\n .output(NotebaseRowGetOutputSchema),\n create: defineAgentProcedure({\n method: \"POST\",\n path: \"/notebase-rows\",\n summary: \"Create note\",\n description:\n \"Create a note in an owned notebase using field IDs and their declared value types. Existing templates generate cards. A duplicate entity ID produces a conflict.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(\n pickPublicErrorMap(\n \"NOTEBASE_NOT_FOUND\",\n \"CELL_VALIDATION_FAILED\",\n \"CONCURRENT_POSITION_CONFLICT\",\n \"NOTE_LIMIT_EXCEEDED\",\n ),\n )\n .errors(pickPublicErrorMap(\"RESOURCE_ALREADY_EXISTS\"))\n .input(NotebaseRowCreateInputSchema)\n .output(NotebaseRowCreateOutputSchema),\n\n createMany: defineAgentProcedure({\n method: \"POST\",\n path: \"/notebase-rows/batch\",\n summary: \"Create notes\",\n description:\n \"Create 1–50 notes atomically in one owned notebase. Cells use field IDs and declared value types. Existing templates generate cards. Duplicate entity IDs roll back the whole batch.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(\n pickPublicErrorMap(\n \"NOTEBASE_NOT_FOUND\",\n \"CELL_VALIDATION_FAILED\",\n \"CONCURRENT_POSITION_CONFLICT\",\n \"NOTE_LIMIT_EXCEEDED\",\n ),\n )\n .errors(pickPublicErrorMap(\"RESOURCE_ALREADY_EXISTS\"))\n .input(NotebaseRowCreateManyInputSchema)\n .output(NotebaseRowCreateManyOutputSchema),\n\n update: defineAgentProcedure({\n method: \"PATCH\",\n path: \"/notebase-rows/{notebaseRowId}\",\n summary: \"Update note\",\n description:\n \"Merge supplied fields into an owned note, preserving omitted fields. Use null to clear a field. expectedUpdatedAt guards against editing stale data; reread on a modification conflict.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_ROW_NOT_FOUND\", \"CELL_VALIDATION_FAILED\"))\n .errors(pickPublicErrorMap(\"RESOURCE_UPDATE_CONFLICT\"))\n .input(NotebaseRowUpdateInputSchema)\n .output(NotebaseRowUpdateOutputSchema),\n\n updateMany: defineAgentProcedure({\n method: \"PATCH\",\n path: \"/notebase-rows/batch\",\n summary: \"Update notes\",\n description:\n \"Update 1–50 notes atomically in one owned notebase. Each row supplies its ID and fields to merge; omitted fields are preserved and null clears a field. Supply each note's expectedUpdatedAt to guard against stale edits. A missing row, invalid field or modification conflict rolls back the whole batch. Items are returned in input order.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(\n pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\", \"NOTEBASE_ROW_NOT_FOUND\", \"CELL_VALIDATION_FAILED\"),\n )\n .errors(pickPublicErrorMap(\"RESOURCE_UPDATE_CONFLICT\"))\n .input(NotebaseRowUpdateManyInputSchema)\n .output(NotebaseRowUpdateManyOutputSchema),\n\n delete: defineAgentProcedure({\n method: \"DELETE\",\n path: \"/notebase-rows/{notebaseRowId}\",\n summary: \"Delete note\",\n description:\n \"Permanently delete an owned note and its derived cards and review records. Return the deleted note ID.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_ROW_NOT_FOUND\", \"CONCURRENT_POSITION_CONFLICT\"))\n .input(NotebaseRowDeleteInputSchema)\n .output(NotebaseRowDeleteOutputSchema),\n\n deleteMany: defineAgentProcedure({\n method: \"POST\",\n path: \"/notebase-rows/batch/delete\",\n summary: \"Delete notes\",\n description:\n \"Permanently delete 1–50 owned notes atomically, including their derived cards and review records. Notes may belong to different notebases. If any ID is missing or inaccessible, nothing is deleted. Return deleted IDs in input order.\",\n tags: [\"Notebase Rows\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_ROW_NOT_FOUND\", \"CONCURRENT_POSITION_CONFLICT\"))\n .input(NotebaseRowDeleteManyInputSchema)\n .output(NotebaseRowDeleteManyOutputSchema),\n\n reorder: oc\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\", \"CONCURRENT_POSITION_CONFLICT\"))\n .route({\n method: \"POST\",\n path: \"/notebase-rows/reorder\",\n summary: \"Reorder notebase rows\",\n tags: [\"Notebase Rows\"],\n })\n .input(NotebaseRowReorderInputSchema)\n .output(NotebaseRowReorderOutputSchema),\n};\n","import type { BillingPlan } from \"./billing\";\nimport { langCodeISO6393Schema } from \"@read-frog/definitions\";\nimport { z } from \"zod\";\n\n// Reading text aloud in the account's voices: the reader's settings, the\n// voices to choose from, and the request that turns a text into audio.\n\n/** The longest text one request reads aloud. */\nexport const SPEECH_TEXT_MAX_LENGTH = 500;\n\n/**\n * How many texts each plan may have read aloud in a day (24 hours from the\n * first one). Generous enough that reviewing never runs into it; the cap is\n * there to keep the voices from being used as a free speech service.\n */\nexport const SPEECH_DAILY_REQUEST_LIMITS = {\n free: 200,\n pro: 5000,\n ultra: 5000,\n} as const satisfies Record<BillingPlan, number>;\n\n/** A voice by its short name: its locale, then the voice (`en-US-AndrewMultilingualNeural`). */\nexport const speechVoiceNameSchema = z\n .string()\n .max(100)\n .regex(/^[a-z]{2,3}(?:-[A-Za-z0-9]+)+(?::[A-Za-z0-9]+)?$/);\nexport type SpeechVoiceName = z.infer<typeof speechVoiceNameSchema>;\n\nexport const SPEECH_RATE_MIN = -50;\nexport const SPEECH_RATE_MAX = 100;\n\n/** Reading speed: percent faster (+) or slower (−) than normal. */\nexport const speechRateSchema = z.number().int().min(SPEECH_RATE_MIN).max(SPEECH_RATE_MAX);\n\n/**\n * How the account reads aloud. A language left out of `languageVoices`, and a\n * `null` `multilingualVoice`, read in the default voice (`speech.listVoices`\n * names them).\n */\nexport const speechPreferencesSchema = z\n .object({\n languageVoices: z.partialRecord(langCodeISO6393Schema, speechVoiceNameSchema),\n // Reads text whose language is not known, working the language out itself.\n multilingualVoice: speechVoiceNameSchema.nullable(),\n rate: speechRateSchema,\n })\n .strict();\nexport type SpeechPreferences = z.infer<typeof speechPreferencesSchema>;\n\nexport const DEFAULT_SPEECH_PREFERENCES: SpeechPreferences = {\n languageVoices: {},\n multilingualVoice: null,\n rate: 0,\n};\n\n/**\n * Changes some settings and keeps the rest. `languageVoices` changes only the\n * languages it names; `null` puts a language back on its default voice.\n */\nexport const speechPreferencesUpdateInputSchema = z\n .object({\n languageVoices: z\n .partialRecord(langCodeISO6393Schema, speechVoiceNameSchema.nullable())\n .optional(),\n multilingualVoice: speechVoiceNameSchema.nullable().optional(),\n rate: speechRateSchema.optional(),\n })\n .strict();\nexport type SpeechPreferencesUpdateInput = z.infer<typeof speechPreferencesUpdateInputSchema>;\n\nexport const speechVoiceGenderSchema = z.enum([\"female\", \"male\", \"neutral\"]);\nexport type SpeechVoiceGender = z.infer<typeof speechVoiceGenderSchema>;\n\nexport const speechVoiceSchema = z\n .object({\n name: speechVoiceNameSchema,\n // The voice's name for people, such as \"Andrew Multilingual\".\n displayName: z.string(),\n locale: z.string(),\n // The language the voice is for; null for one this list has no code for.\n language: langCodeISO6393Schema.nullable(),\n gender: speechVoiceGenderSchema,\n // Reads many languages, working out the text's language itself.\n multilingual: z.boolean(),\n })\n .strict();\nexport type SpeechVoice = z.infer<typeof speechVoiceSchema>;\n\nexport const speechVoicesOutputSchema = z\n .object({\n voices: z.array(speechVoiceSchema),\n // The voice each language reads in until the reader picks one.\n defaultVoices: z.partialRecord(langCodeISO6393Schema, speechVoiceNameSchema),\n defaultMultilingualVoice: speechVoiceNameSchema,\n })\n .strict();\nexport type SpeechVoicesOutput = z.infer<typeof speechVoicesOutputSchema>;\n\nexport const speechSynthesizeInputSchema = z\n .object({\n text: z.string().trim().min(1).max(SPEECH_TEXT_MAX_LENGTH),\n // The text's language, when the caller knows it; without one, a\n // multilingual voice works it out.\n language: langCodeISO6393Schema.optional(),\n // Reads in this voice instead of the account's, such as one the reader is\n // trying out in the settings.\n voice: speechVoiceNameSchema.optional(),\n })\n .strict();\nexport type SpeechSynthesizeInput = z.infer<typeof speechSynthesizeInputSchema>;\n\n/**\n * Where to download the audio, an MP3: a link to fetch at once, which stops\n * working at `expiresAt`.\n */\nexport const speechSynthesizeOutputSchema = z\n .object({\n url: z.url(),\n expiresAt: z.coerce.date(),\n })\n .strict();\nexport type SpeechSynthesizeOutput = z.infer<typeof speechSynthesizeOutputSchema>;\n","import { oc } from \"@orpc/contract\";\nimport {\n speechPreferencesSchema,\n speechPreferencesUpdateInputSchema,\n speechSynthesizeInputSchema,\n speechSynthesizeOutputSchema,\n speechVoicesOutputSchema,\n} from \"#/schemas/speech\";\n\nexport const speechContract = {\n getPreferences: oc\n .route({\n method: \"GET\",\n path: \"/speech/preferences\",\n summary: \"Get how the authenticated user's text is read aloud\",\n tags: [\"Speech\"],\n })\n .output(speechPreferencesSchema),\n updatePreferences: oc\n .route({\n method: \"PATCH\",\n path: \"/speech/preferences\",\n summary: \"Change how the authenticated user's text is read aloud\",\n tags: [\"Speech\"],\n })\n .input(speechPreferencesUpdateInputSchema)\n .output(speechPreferencesSchema),\n listVoices: oc\n .route({\n method: \"GET\",\n path: \"/speech/voices\",\n summary: \"List the voices text can be read aloud in, and each language's default\",\n tags: [\"Speech\"],\n })\n .output(speechVoicesOutputSchema),\n synthesize: oc\n .route({\n method: \"POST\",\n path: \"/speech/synthesize\",\n summary: \"Read a text aloud, and link to its MP3 audio\",\n tags: [\"Speech\"],\n })\n .input(speechSynthesizeInputSchema)\n .output(speechSynthesizeOutputSchema),\n};\n","import { canonicalTimeZone } from \"@read-frog/definitions\";\nimport { z } from \"zod\";\n\n// @ref https://zenn.dev/herp_inc/articles/js-intl-date-time-format-performance\n// Keyed by the lowercased id, because Intl matches ids case-insensitively: raw\n// keys would let every casing of a zone pin its own entry for the life of the\n// process. Links (Asia/Kolkata) share their canonical zone's formatter (~30 KB\n// of ICU memory each), so the map holds one key per IANA name. Offset zones\n// (\"+08:00\") are valid but stay uncached, because there are ~2.9k of them.\nconst timezoneFormatters = new Map<string, Intl.DateTimeFormat>();\n\n// ASCII only, as Intl does: toLowerCase() would also fold look-alikes such as\n// the Kelvin sign onto \"k\", letting an id Intl rejects hit a cached zone.\nfunction toCacheKey(timezone: string) {\n return timezone.replace(/[A-Z]/g, (letter) => letter.toLowerCase());\n}\n\nfunction getTimezoneFormatter(timezone: string): Intl.DateTimeFormat {\n const key = toCacheKey(timezone);\n const cached = timezoneFormatters.get(key);\n if (cached) {\n return cached;\n }\n\n const formatter = new Intl.DateTimeFormat(\"en-US\", { timeZone: timezone });\n const canonical = formatter.resolvedOptions().timeZone;\n if (canonical.startsWith(\"+\") || canonical.startsWith(\"-\")) {\n return formatter;\n }\n\n const canonicalKey = toCacheKey(canonical);\n const shared = timezoneFormatters.get(canonicalKey) ?? formatter;\n timezoneFormatters.set(canonicalKey, shared).set(key, shared);\n return shared;\n}\n\nexport const timezoneSchema = z\n .string()\n .trim()\n .min(1)\n .refine((timezone) => {\n try {\n getTimezoneFormatter(timezone).format(new Date());\n return true;\n } catch {\n return false;\n }\n }, \"Invalid timezone\");\nexport type Timezone = z.infer<typeof timezoneSchema>;\n\n/**\n * The zone a call reckons days in, under the name an account's zone is stored\n * under (`canonicalTimeZone`): \"Asia/Calcutta\" arrives as \"Asia/Kolkata\" and\n * \"CST\" as \"America/Chicago\", names that Temporal and a Debian Postgres both\n * read. A fixed offset (\"+08:00\") is refused, as Postgres reads it with the\n * opposite sign and would put the call's days on the wrong side of UTC.\n */\nexport const canonicalTimezoneSchema = timezoneSchema.transform((timezone, ctx) => {\n const name = canonicalTimeZone(timezone);\n if (!name) {\n ctx.addIssue({\n code: \"custom\",\n message:\n \"Use an IANA time zone identifier instead of a fixed UTC offset. See https://www.iana.org/time-zones\",\n });\n return z.NEVER;\n }\n return name;\n});\n","import { paginationShape } from \"./pagination\";\nimport {\n activeScheduleStatusSchema,\n cardStateSchema,\n fsrsReviewLogSnapshotSchema,\n fsrsMemoryStateSchema,\n reviewRatingSchema,\n scheduleStatusSchema,\n schedulingParamsSchema,\n SRS_REVIEW_DURATION_MS_MAX,\n srsStepSchema,\n} from \"@read-frog/definitions\";\nimport { z } from \"zod\";\nimport { cardSchema } from \"./card\";\nimport { notebaseSummarySchema } from \"./notebase\";\nimport { canonicalTimezoneSchema } from \"./timezone\";\n\nexport { reviewRatingSchema, schedulingParamsSchema, SRS_REVIEW_DURATION_MS_MAX };\nexport { timezoneSchema } from \"./timezone\";\nexport type { Timezone } from \"./timezone\";\nexport type { ReviewRating, SchedulingParams } from \"@read-frog/definitions\";\n\nexport const stepSchema = srsStepSchema;\nexport type Step = z.infer<typeof stepSchema>;\n\nexport const SRS_REVIEW_CLIENT_ID_NAMESPACE = \"6ba7b811-9dad-11d1-80b4-00c04fd430c8\";\nconst srsReviewClientIdNamePrefix = \"readfrog:srs-review\";\nconst nullLastReviewTimeSentinel = \"null\";\n\nexport interface SrsReviewClientIdCard {\n id: string;\n lastReviewTime: Date | string | null;\n}\n\nexport async function createSrsReviewClientId(card: SrsReviewClientIdCard) {\n return uuidV5(\n `${srsReviewClientIdNamePrefix}:${card.id}:${formatLastReviewTime(card.lastReviewTime)}`,\n SRS_REVIEW_CLIENT_ID_NAMESPACE,\n );\n}\n\nexport const srsReviewInputSchema = z\n .object({\n cardId: z.uuid(),\n id: z.uuid().optional(),\n rating: reviewRatingSchema,\n durationMs: z.number().int().min(0).max(SRS_REVIEW_DURATION_MS_MAX),\n timezone: canonicalTimezoneSchema,\n })\n .strict();\nexport type SrsReviewInput = z.infer<typeof srsReviewInputSchema>;\n\nexport const srsRollbackReviewInputSchema = z\n .object({\n expectedReviewId: z.uuid().optional(),\n cardId: z.uuid(),\n })\n .strict();\nexport type SrsRollbackReviewInput = z.infer<typeof srsRollbackReviewInputSchema>;\n\nexport const srsScheduleStatusStatsSchema = z.record(\n activeScheduleStatusSchema,\n z.number().int().min(0),\n);\nexport type SrsScheduleStatusStats = z.infer<typeof srsScheduleStatusStatsSchema>;\n\nexport const srsScheduleStatusStatsInputSchema = z\n .object({\n notebaseIds: z.array(z.uuid()).optional(),\n timezone: canonicalTimezoneSchema,\n })\n .strict();\nexport type SrsScheduleStatusStatsInput = z.infer<typeof srsScheduleStatusStatsInputSchema>;\n\nexport const srsScheduleStatusStatsOutputSchema = z.record(z.uuid(), srsScheduleStatusStatsSchema);\nexport type SrsScheduleStatusStatsOutput = z.infer<typeof srsScheduleStatusStatsOutputSchema>;\n\nexport const srsRecentNotebaseScheduleStatusStatsInputSchema = z\n .object({\n timezone: canonicalTimezoneSchema,\n })\n .strict();\nexport type SrsRecentNotebaseScheduleStatusStatsInput = z.infer<\n typeof srsRecentNotebaseScheduleStatusStatsInputSchema\n>;\n\n/** Null when the user has no notebase yet. */\nexport const srsRecentNotebaseScheduleStatusStatsOutputSchema = z\n .object({\n notebase: notebaseSummarySchema,\n stats: srsScheduleStatusStatsSchema,\n })\n .nullable();\nexport type SrsRecentNotebaseScheduleStatusStatsOutput = z.infer<\n typeof srsRecentNotebaseScheduleStatusStatsOutputSchema\n>;\n\nexport const srsManualCardStatusInputSchema = z\n .object({\n cardId: z.uuid(),\n enabled: z.boolean(),\n })\n .strict();\nexport type SrsManualCardStatusInput = z.infer<typeof srsManualCardStatusInputSchema>;\n\nexport const srsSetCardBuriedInputSchema = srsManualCardStatusInputSchema;\nexport type SrsSetCardBuriedInput = SrsManualCardStatusInput;\n\nexport const srsSetCardSuspendedInputSchema = srsManualCardStatusInputSchema;\nexport type SrsSetCardSuspendedInput = SrsManualCardStatusInput;\n\nexport const srsRevlogSchema = z.object({\n id: z.uuid(),\n notebaseId: z.uuid(),\n cardId: z.uuid(),\n rating: reviewRatingSchema,\n state: cardStateSchema,\n stability: z.number(),\n afterScheduleStatus: scheduleStatusSchema,\n afterMemoryState: fsrsMemoryStateSchema,\n retentionDays90: z.number().nonnegative(),\n afterRetentionDays90: z.number().nonnegative(),\n reviewedAt: z.coerce.date(),\n durationMs: z.number().int(),\n fsrsReviewLogSnapshot: fsrsReviewLogSnapshotSchema,\n createdAt: z.coerce.date(),\n});\nexport type SrsRevlog = z.infer<typeof srsRevlogSchema>;\n\nexport const srsRevlogWithoutSnapshotSchema = srsRevlogSchema.omit({\n fsrsReviewLogSnapshot: true,\n});\nexport type SrsRevlogWithoutSnapshot = z.infer<typeof srsRevlogWithoutSnapshotSchema>;\n\nexport const srsListCardRevlogsInputSchema = z\n .object({\n ...paginationShape,\n notebaseId: z.uuid().optional(),\n cardId: z.uuid().optional(),\n })\n .strict();\nexport type SrsListCardRevlogsInput = z.infer<typeof srsListCardRevlogsInputSchema>;\n\nexport const srsListCardRevlogsOutputSchema = z\n .object({\n items: z.array(srsRevlogWithoutSnapshotSchema),\n hasMore: z.boolean(),\n })\n .strict();\nexport type SrsListCardRevlogsOutput = z.infer<typeof srsListCardRevlogsOutputSchema>;\n\nexport const srsReviewOutputSchema = z.object({\n card: cardSchema,\n revlog: srsRevlogSchema,\n txid: z.number(),\n // False when an idempotent replay returned an existing revlog instead of creating one.\n created: z.boolean(),\n});\nexport type SrsReviewOutput = z.infer<typeof srsReviewOutputSchema>;\n\nexport const srsRollbackReviewOutputSchema = z.object({\n card: cardSchema,\n rolledBackRevlogId: z.uuid(),\n txid: z.number(),\n});\nexport type SrsRollbackReviewOutput = z.infer<typeof srsRollbackReviewOutputSchema>;\n\nexport const srsTxidOutputSchema = z.object({\n txid: z.number(),\n});\nexport type SrsTxidOutput = z.infer<typeof srsTxidOutputSchema>;\n\nexport const srsSetCardBuriedOutputSchema = srsTxidOutputSchema;\nexport type SrsSetCardBuriedOutput = SrsTxidOutput;\n\nexport const srsSetCardSuspendedOutputSchema = srsTxidOutputSchema;\nexport type SrsSetCardSuspendedOutput = SrsTxidOutput;\n\nexport const srsListUnreadOptimizerResultsInputSchema = z.object({}).strict();\n\nexport const srsOptimizerUnreadResultSchema = z\n .object({\n runId: z.uuid(),\n notebaseName: z.string().min(1),\n revlogCount: z.number().int().positive(),\n improvement: z.number().nonnegative().nullable(),\n })\n .strict();\nexport type SrsOptimizerUnreadResult = z.infer<typeof srsOptimizerUnreadResultSchema>;\n\nexport const srsListUnreadOptimizerResultsOutputSchema = z.array(srsOptimizerUnreadResultSchema);\nexport type SrsListUnreadOptimizerResultsOutput = z.infer<\n typeof srsListUnreadOptimizerResultsOutputSchema\n>;\n\nexport const srsAcknowledgeOptimizerResultsInputSchema = z\n .object({\n runIds: z.array(z.uuid()).min(1),\n })\n .strict();\nexport type SrsAcknowledgeOptimizerResultsInput = z.infer<\n typeof srsAcknowledgeOptimizerResultsInputSchema\n>;\n\nexport const srsAcknowledgeOptimizerResultsOutputSchema = z\n .object({\n acknowledgedCount: z.number().int().nonnegative(),\n })\n .strict();\nexport type SrsAcknowledgeOptimizerResultsOutput = z.infer<\n typeof srsAcknowledgeOptimizerResultsOutputSchema\n>;\n\nfunction formatLastReviewTime(lastReviewTime: Date | string | null) {\n return lastReviewTime ? new Date(lastReviewTime).toISOString() : nullLastReviewTimeSentinel;\n}\n\nasync function uuidV5(name: string, namespace: string) {\n const namespaceBytes = uuidToBytes(namespace);\n const nameBytes = new TextEncoder().encode(name);\n const input = new Uint8Array(namespaceBytes.length + nameBytes.length);\n input.set(namespaceBytes);\n input.set(nameBytes, namespaceBytes.length);\n\n const hash = new Uint8Array(await crypto.subtle.digest(\"SHA-1\", input));\n const bytes = hash.slice(0, 16);\n const versionByte = bytes[6];\n const variantByte = bytes[8];\n if (versionByte === undefined || variantByte === undefined) {\n throw new Error(\"SHA-1 digest was too short\");\n }\n bytes[6] = (versionByte & 0x0f) | 0x50;\n bytes[8] = (variantByte & 0x3f) | 0x80;\n\n return bytesToUuid(bytes);\n}\n\nfunction uuidToBytes(uuid: string) {\n const hex = uuid.replaceAll(\"-\", \"\").toLowerCase();\n /* v8 ignore next 3 -- SRS_REVIEW_CLIENT_ID_NAMESPACE is a fixed valid UUID. */\n if (!/^[0-9a-f]{32}$/.test(hex)) {\n throw new Error(\"Invalid UUID namespace\");\n }\n\n return new Uint8Array(\n Array.from({ length: 16 }, (_, index) =>\n Number.parseInt(hex.slice(index * 2, index * 2 + 2), 16),\n ),\n );\n}\n\nfunction bytesToUuid(bytes: Uint8Array) {\n const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\"));\n return [\n hex.slice(0, 4).join(\"\"),\n hex.slice(4, 6).join(\"\"),\n hex.slice(6, 8).join(\"\"),\n hex.slice(8, 10).join(\"\"),\n hex.slice(10, 16).join(\"\"),\n ].join(\"-\");\n}\n","import { defineAgentProcedure } from \"./shared\";\nimport { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n srsAcknowledgeOptimizerResultsInputSchema,\n srsAcknowledgeOptimizerResultsOutputSchema,\n srsListCardRevlogsInputSchema,\n srsListCardRevlogsOutputSchema,\n srsListUnreadOptimizerResultsInputSchema,\n srsListUnreadOptimizerResultsOutputSchema,\n srsRecentNotebaseScheduleStatusStatsInputSchema,\n srsRecentNotebaseScheduleStatusStatsOutputSchema,\n srsReviewInputSchema,\n srsReviewOutputSchema,\n srsRollbackReviewInputSchema,\n srsRollbackReviewOutputSchema,\n srsScheduleStatusStatsInputSchema,\n srsScheduleStatusStatsOutputSchema,\n srsSetCardBuriedInputSchema,\n srsSetCardBuriedOutputSchema,\n srsSetCardSuspendedInputSchema,\n srsSetCardSuspendedOutputSchema,\n} from \"#/schemas/srs\";\n\nexport const srsContract = {\n scheduleStatusStats: defineAgentProcedure({\n method: \"GET\",\n path: \"/srs/schedule-status-stats\",\n summary: \"Get study statistics\",\n description:\n \"Read existing study queue counts for owned notebases in the supplied timezone. Does not return note content or card faces.\",\n tags: [\"SRS\"],\n })\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .input(srsScheduleStatusStatsInputSchema)\n .output(srsScheduleStatusStatsOutputSchema),\n recentNotebaseScheduleStatusStats: oc\n .route({\n method: \"GET\",\n path: \"/srs/schedule-status-stats/recent\",\n summary: \"Get study queue counts of the most recently used notebase\",\n description:\n \"Picks the owned notebase with the latest review or content edit (notes, fields or templates) and returns its study queue counts in the supplied timezone.\",\n tags: [\"SRS\"],\n })\n .input(srsRecentNotebaseScheduleStatusStatsInputSchema)\n .output(srsRecentNotebaseScheduleStatusStatsOutputSchema),\n listUnreadOptimizerResults: oc\n .route({\n method: \"GET\",\n path: \"/srs/optimizer-results/unread\",\n summary: \"List unread applied SRS optimizer results\",\n tags: [\"SRS\"],\n })\n .input(srsListUnreadOptimizerResultsInputSchema)\n .output(srsListUnreadOptimizerResultsOutputSchema),\n\n acknowledgeOptimizerResults: oc\n .route({\n method: \"POST\",\n path: \"/srs/optimizer-results/acknowledge\",\n summary: \"Acknowledge current SRS optimizer results\",\n tags: [\"SRS\"],\n })\n .input(srsAcknowledgeOptimizerResultsInputSchema)\n .output(srsAcknowledgeOptimizerResultsOutputSchema),\n\n listCardRevlogs: defineAgentProcedure({\n method: \"GET\",\n path: \"/srs/revlogs\",\n summary: \"List review history\",\n description:\n \"Read owned review records, optionally filtered by notebase or card. Supports limit and offset pagination. Note content, card faces and rollback snapshots are excluded.\",\n tags: [\"SRS\"],\n })\n .errors(pickPublicErrorMap(\"CARD_NOT_FOUND\", \"NOTEBASE_NOT_FOUND\"))\n .input(srsListCardRevlogsInputSchema)\n .output(srsListCardRevlogsOutputSchema),\n\n review: defineAgentProcedure({\n method: \"POST\",\n path: \"/srs/review\",\n summary: \"Record review\",\n description:\n \"Submit one rating for a known owned card without a queue, session or prerequisite read. Existing SRS eligibility, scheduling and sibling rules apply. The optional id is the existing state-derived review ID, not an arbitrary UUID; calls without a stable id are not guaranteed to deduplicate.\",\n tags: [\"SRS\"],\n })\n .errors(pickPublicErrorMap(\"CARD_NOT_FOUND\", \"CARD_NOT_REVIEWABLE\", \"CARD_REVIEW_STATE_STALE\"))\n .input(srsReviewInputSchema)\n .output(srsReviewOutputSchema),\n rollbackReview: defineAgentProcedure({\n method: \"POST\",\n path: \"/srs/review/rollback\",\n summary: \"Undo review\",\n description:\n \"Undo the latest eligible review of one owned card, preserving existing SRS restrictions and sibling restoration. expectedReviewId guards against undoing an earlier review on a retry.\",\n tags: [\"SRS\"],\n })\n .errors(\n pickPublicErrorMap(\n \"CARD_NOT_FOUND\",\n \"CARD_REVIEW_ROLLBACK_UNAVAILABLE\",\n \"CARD_REVIEW_STATE_STALE\",\n ),\n )\n .input(srsRollbackReviewInputSchema)\n .output(srsRollbackReviewOutputSchema),\n setCardBuried: defineAgentProcedure({\n method: \"POST\",\n path: \"/srs/card/bury\",\n summary: \"Set card buried\",\n description:\n \"Bury or unbury one owned card. enabled=true buries and enabled=false unburies it. Existing state-change rules apply.\",\n tags: [\"SRS\"],\n })\n .errors(\n pickPublicErrorMap(\n \"CARD_NOT_FOUND\",\n \"CARD_ALREADY_BURIED\",\n \"CARD_NOT_BURIED\",\n \"CARD_STATUS_CHANGE_UNAVAILABLE\",\n ),\n )\n .input(srsSetCardBuriedInputSchema)\n .output(srsSetCardBuriedOutputSchema),\n setCardSuspended: defineAgentProcedure({\n method: \"POST\",\n path: \"/srs/card/suspend\",\n summary: \"Set card suspended\",\n description:\n \"Suspend or resume one owned card. enabled=true suspends and enabled=false resumes it. Existing state-change rules apply.\",\n tags: [\"SRS\"],\n })\n .errors(\n pickPublicErrorMap(\n \"CARD_NOT_FOUND\",\n \"CARD_ALREADY_SUSPENDED\",\n \"CARD_NOT_SUSPENDED\",\n \"CARD_STATUS_CHANGE_UNAVAILABLE\",\n ),\n )\n .input(srsSetCardSuspendedInputSchema)\n .output(srsSetCardSuspendedOutputSchema),\n};\n","import { z } from \"zod\";\n\nexport const notebaseActivityStatsItemSchema = z\n .object({\n date: z.iso.date(),\n notes: z.number().int().nonnegative(),\n })\n .strict();\nexport type NotebaseActivityStatsItem = z.infer<typeof notebaseActivityStatsItemSchema>;\n\nexport const notebaseActivityStatsOutputSchema = z\n .object({\n daily: z.array(notebaseActivityStatsItemSchema),\n })\n .strict();\nexport type NotebaseActivityStatsOutput = z.infer<typeof notebaseActivityStatsOutputSchema>;\n\nexport const notebaseRowGrowthStatsItemSchema = z\n .object({\n date: z.iso.date(),\n delta: z.number().int(),\n })\n .strict();\nexport type NotebaseRowGrowthStatsItem = z.infer<typeof notebaseRowGrowthStatsItemSchema>;\n\nexport const notebaseRowGrowthStatsOutputSchema = z\n .object({\n baseTotal: z.number().int().nonnegative(),\n daily: z.array(notebaseRowGrowthStatsItemSchema),\n })\n .strict();\nexport type NotebaseRowGrowthStatsOutput = z.infer<typeof notebaseRowGrowthStatsOutputSchema>;\n","import { z } from \"zod\";\n\nexport const srsActivityStatsItemSchema = z\n .object({\n date: z.iso.date(),\n answers: z.number().int().nonnegative(),\n durationMs: z.number().int().nonnegative(),\n })\n .strict();\nexport type SrsActivityStatsItem = z.infer<typeof srsActivityStatsItemSchema>;\n\nexport const srsActivityStatsOutputSchema = z\n .object({\n learnedCards: z.number().int().nonnegative(),\n daily: z.array(srsActivityStatsItemSchema),\n })\n .strict();\nexport type SrsActivityStatsOutput = z.infer<typeof srsActivityStatsOutputSchema>;\n\nexport const srsMemoryGrowthStatsItemSchema = z\n .object({\n date: z.iso.date(),\n delta: z.number().int(),\n })\n .strict();\nexport type SrsMemoryGrowthStatsItem = z.infer<typeof srsMemoryGrowthStatsItemSchema>;\n\nexport const srsMemoryGrowthStatsOutputSchema = z\n .object({\n baseTotal: z.number().int().nonnegative(),\n daily: z.array(srsMemoryGrowthStatsItemSchema),\n })\n .strict();\nexport type SrsMemoryGrowthStatsOutput = z.infer<typeof srsMemoryGrowthStatsOutputSchema>;\n","import { z } from \"zod\";\nimport { notebaseActivityStatsOutputSchema } from \"./notebase-stats\";\nimport { srsActivityStatsOutputSchema } from \"./srs-stats\";\nimport { canonicalTimezoneSchema } from \"./timezone\";\n\nconst statsNotebaseIdsSchema = z\n .array(z.uuid())\n .min(1)\n .transform((ids) => Array.from(new Set(ids)));\n\nexport const statsInputSchema = z\n .object({\n notebaseIds: statsNotebaseIdsSchema.optional(),\n from: z.iso.date().optional(),\n to: z.iso.date(),\n timezone: canonicalTimezoneSchema,\n })\n .strict()\n .refine((input) => !input.from || input.from <= input.to, {\n message: \"from must be before or equal to to\",\n path: [\"from\"],\n });\nexport type StatsInput = z.infer<typeof statsInputSchema>;\n\nexport const activityStatsOutputSchema = z\n .object({\n srs: srsActivityStatsOutputSchema,\n notebase: notebaseActivityStatsOutputSchema,\n })\n .strict();\nexport type ActivityStatsOutput = z.infer<typeof activityStatsOutputSchema>;\n","import { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport { notebaseRowGrowthStatsOutputSchema } from \"#/schemas/notebase-stats\";\nimport { srsMemoryGrowthStatsOutputSchema } from \"#/schemas/srs-stats\";\nimport { activityStatsOutputSchema, statsInputSchema } from \"#/schemas/stats\";\n\nexport const statsContract = {\n activity: oc\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .route({\n method: \"GET\",\n path: \"/stats/activity\",\n summary: \"Get SRS and notebase activity statistics\",\n tags: [\"Statistics\"],\n })\n .input(statsInputSchema)\n .output(activityStatsOutputSchema),\n\n srsMemoryGrowth: oc\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .route({\n method: \"GET\",\n path: \"/srs/stats/memory-growth\",\n summary: \"Get SRS long-term memory growth statistics\",\n tags: [\"Statistics\"],\n })\n .input(statsInputSchema)\n .output(srsMemoryGrowthStatsOutputSchema),\n\n notebaseRowGrowth: oc\n .errors(pickPublicErrorMap(\"NOTEBASE_NOT_FOUND\"))\n .route({\n method: \"GET\",\n path: \"/notebases/stats/row-growth\",\n summary: \"Get notebase row growth statistics\",\n tags: [\"Statistics\"],\n })\n .input(statsInputSchema)\n .output(notebaseRowGrowthStatsOutputSchema),\n};\n","import { z } from \"zod\";\nimport { appLocaleSchema } from \"./app-locale\";\nimport { timezoneSchema } from \"./timezone\";\n\nexport const userEnsureTimezoneInputSchema = z\n .object({\n timezone: timezoneSchema,\n })\n .strict();\nexport type UserEnsureTimezoneInput = z.infer<typeof userEnsureTimezoneInputSchema>;\n\nexport const userEnsureTimezoneOutputSchema = z\n .object({\n timezone: timezoneSchema,\n updated: z.boolean(),\n })\n .strict();\nexport type UserEnsureTimezoneOutput = z.infer<typeof userEnsureTimezoneOutputSchema>;\n\nexport const userUpdateTimezoneInputSchema = z\n .object({\n timezone: timezoneSchema,\n })\n .strict();\nexport type UserUpdateTimezoneInput = z.infer<typeof userUpdateTimezoneInputSchema>;\n\nexport const userUpdateTimezoneOutputSchema = z\n .object({\n timezone: timezoneSchema,\n })\n .strict();\nexport type UserUpdateTimezoneOutput = z.infer<typeof userUpdateTimezoneOutputSchema>;\n\n// The account's language, which emails are written in. `ensureLocale` only\n// fills it in when it is empty (the language www is showing on a signed-in\n// visit); `updateLocale` is the user choosing a language.\nexport const userEnsureLocaleInputSchema = z\n .object({\n locale: appLocaleSchema,\n })\n .strict();\nexport type UserEnsureLocaleInput = z.infer<typeof userEnsureLocaleInputSchema>;\n\nexport const userEnsureLocaleOutputSchema = z\n .object({\n locale: appLocaleSchema,\n updated: z.boolean(),\n })\n .strict();\nexport type UserEnsureLocaleOutput = z.infer<typeof userEnsureLocaleOutputSchema>;\n\nexport const userUpdateLocaleInputSchema = z\n .object({\n locale: appLocaleSchema,\n })\n .strict();\nexport type UserUpdateLocaleInput = z.infer<typeof userUpdateLocaleInputSchema>;\n\nexport const userUpdateLocaleOutputSchema = z\n .object({\n locale: appLocaleSchema,\n })\n .strict();\nexport type UserUpdateLocaleOutput = z.infer<typeof userUpdateLocaleOutputSchema>;\n","import { oc } from \"@orpc/contract\";\nimport {\n userEnsureLocaleInputSchema,\n userEnsureLocaleOutputSchema,\n userEnsureTimezoneInputSchema,\n userEnsureTimezoneOutputSchema,\n userUpdateLocaleInputSchema,\n userUpdateLocaleOutputSchema,\n userUpdateTimezoneInputSchema,\n userUpdateTimezoneOutputSchema,\n} from \"#/schemas/user\";\n\nexport const userContract = {\n ensureTimezone: oc\n .route({\n method: \"POST\",\n path: \"/users/me/timezone/ensure\",\n summary: \"Ensure the authenticated user has a timezone\",\n tags: [\"Users\"],\n })\n .input(userEnsureTimezoneInputSchema)\n .output(userEnsureTimezoneOutputSchema),\n updateTimezone: oc\n .route({\n method: \"PATCH\",\n path: \"/users/me/timezone\",\n summary: \"Update the authenticated user's timezone\",\n tags: [\"Users\"],\n })\n .input(userUpdateTimezoneInputSchema)\n .output(userUpdateTimezoneOutputSchema),\n ensureLocale: oc\n .route({\n method: \"POST\",\n path: \"/users/me/locale/ensure\",\n summary: \"Ensure the authenticated user has a locale\",\n tags: [\"Users\"],\n })\n .input(userEnsureLocaleInputSchema)\n .output(userEnsureLocaleOutputSchema),\n updateLocale: oc\n .route({\n method: \"PATCH\",\n path: \"/users/me/locale\",\n summary: \"Update the authenticated user's locale\",\n tags: [\"Users\"],\n })\n .input(userUpdateLocaleInputSchema)\n .output(userUpdateLocaleOutputSchema),\n};\n","import { getVideoIdFromUrl, transcriptSegmentSchema } from \"@read-frog/definitions\";\nimport { z } from \"zod\";\nimport { billingPlanSchema } from \"./billing\";\n\nexport const videoTranscriptStatusSchema = z.enum([\"pending\", \"processing\", \"completed\", \"failed\"]);\nexport type VideoTranscriptStatus = z.infer<typeof videoTranscriptStatusSchema>;\n\n// The transcript \"job\" resource: status + metadata, without the (heavy) segments payload.\nexport const videoTranscriptResourceSchema = z.object({\n id: z.string(),\n platform: z.string(),\n videoId: z.string(),\n url: z.string(),\n status: videoTranscriptStatusSchema,\n title: z.string().nullable(),\n durationSec: z.number().nullable(),\n detectedLanguage: z.string().nullable(),\n error: z.string().nullable(),\n createdAt: z.date(),\n updatedAt: z.date(),\n});\nexport type VideoTranscriptResource = z.infer<typeof videoTranscriptResourceSchema>;\n\n// The subtitles sub-resource: the segments + model-detected language, only available once completed.\nexport const videoTranscriptSubtitlesSchema = z.object({\n id: z.string(),\n detectedLanguage: z.string().nullable(),\n segments: z.array(transcriptSegmentSchema),\n});\nexport type VideoTranscriptSubtitles = z.infer<typeof videoTranscriptSubtitlesSchema>;\n\nexport const videoTranscriptCreateInputSchema = z\n .object({\n url: z.url().refine((url) => getVideoIdFromUrl(url) !== null, {\n message: \"url must be a supported video URL\",\n }),\n // The player's own duration, read from the media element. REQUIRED, and an\n // untrusted UX hint only: admission uses it to reject an over-quota request\n // instantly, but every reservation and charge is made against the\n // server-measured duration in the worker — lying here changes nothing about\n // what gets billed.\n durationSec: z.number().int().positive(),\n })\n .strict();\nexport type VideoTranscriptCreateInput = z.infer<typeof videoTranscriptCreateInputSchema>;\n\nexport const videoTranscriptGetInputSchema = z\n .object({\n id: z.uuid(),\n })\n .strict();\nexport type VideoTranscriptGetInput = z.infer<typeof videoTranscriptGetInputSchema>;\n\n// One quota pool as shown to the user. `resetAt` is null for a one-time grant\n// (it never resets); `expiresAt` is null for a monthly pool (its end is the\n// reset). Minutes are display units: `usedMinutes` rounds up and\n// `limitMinutes` rounds down, so the UI can never show headroom that\n// admission (which compares raw seconds) would deny.\nexport const videoTranscriptUsagePoolSchema = z.object({\n id: z.string(),\n usedMinutes: z.number().int(),\n limitMinutes: z.number().int(),\n remainingMinutes: z.number().int(),\n resetAt: z.iso.datetime().nullable(),\n expiresAt: z.iso.datetime().nullable(),\n});\nexport type VideoTranscriptUsagePool = z.infer<typeof videoTranscriptUsagePoolSchema>;\n\n// The caller's transcription quota usage. Totals aggregate across pools;\n// `remainingMinutes` nets out in-flight reservations (committed), while each\n// pool's `usedMinutes` shows settled spend only, so a progress bar cannot run\n// forward and then backwards when a job is released. Deliberately a non-strict\n// object: old clients strip the keys they don't know.\nexport const videoTranscriptUsageSchema = z.object({\n usedMinutes: z.number().int(),\n limitMinutes: z.number().int(),\n remainingMinutes: z.number().int(),\n plan: billingPlanSchema,\n pools: z.array(videoTranscriptUsagePoolSchema),\n});\nexport type VideoTranscriptUsage = z.infer<typeof videoTranscriptUsageSchema>;\n","import { oc } from \"@orpc/contract\";\nimport { pickPublicErrorMap } from \"#/public-errors\";\nimport {\n videoTranscriptCreateInputSchema,\n videoTranscriptGetInputSchema,\n videoTranscriptResourceSchema,\n videoTranscriptSubtitlesSchema,\n videoTranscriptUsageSchema,\n} from \"#/schemas/video-transcript\";\n\nexport const videoTranscriptContract = {\n create: oc\n .errors(\n pickPublicErrorMap(\n \"VIDEO_TRANSCRIPTION_QUOTA_EXCEEDED\",\n \"VIDEO_TRANSCRIPTION_SUBSCRIPTION_REQUIRED\",\n \"VIDEO_TRANSCRIPTION_PAYMENT_REQUIRED\",\n \"VIDEO_TRANSCRIPTION_UNSUPPORTED_LENGTH\",\n ),\n )\n .route({\n method: \"POST\",\n path: \"/video-transcripts\",\n summary: \"Create or reuse a video transcription job\",\n tags: [\"Video Transcription\"],\n })\n .input(videoTranscriptCreateInputSchema)\n .output(videoTranscriptResourceSchema),\n getUsage: oc\n .route({\n method: \"GET\",\n path: \"/video-transcripts/usage\",\n summary: \"Get the caller's monthly transcription quota usage\",\n tags: [\"Video Transcription\"],\n })\n .output(videoTranscriptUsageSchema),\n get: oc\n .errors(\n pickPublicErrorMap(\"VIDEO_TRANSCRIPT_NOT_FOUND\", \"VIDEO_TRANSCRIPTION_SUBSCRIPTION_REQUIRED\"),\n )\n .route({\n method: \"GET\",\n path: \"/video-transcripts/{id}\",\n summary: \"Get a video transcription job's status\",\n tags: [\"Video Transcription\"],\n })\n .input(videoTranscriptGetInputSchema)\n .output(videoTranscriptResourceSchema),\n getSubtitles: oc\n .errors(\n pickPublicErrorMap(\n \"VIDEO_TRANSCRIPT_NOT_FOUND\",\n \"VIDEO_TRANSCRIPT_NOT_READY\",\n \"VIDEO_TRANSCRIPTION_SUBSCRIPTION_REQUIRED\",\n ),\n )\n .route({\n method: \"GET\",\n path: \"/video-transcripts/{id}/subtitles\",\n summary: \"Get a completed video transcript's subtitles\",\n tags: [\"Video Transcription\"],\n })\n .input(videoTranscriptGetInputSchema)\n .output(videoTranscriptSubtitlesSchema),\n};\n","import type { ContractRouterClient } from \"@orpc/contract\";\nimport { billingContract } from \"./contracts/billing\";\nimport { cardContract } from \"./contracts/card\";\nimport { cardTemplateContract } from \"./contracts/card-template\";\nimport { ebookContract } from \"./contracts/ebook\";\nimport { emailPreferencesContract } from \"./contracts/email-preferences\";\nimport { featureAccessContract } from \"./contracts/feature-access\";\nimport { hostedAiContract } from \"./contracts/hosted-ai\";\nimport { masteryGoalContract } from \"./contracts/mastery-goal\";\nimport { mcpConnectionContract } from \"./contracts/mcp-connection\";\nimport { notebaseContract } from \"./contracts/notebase\";\nimport { notebaseColumnContract } from \"./contracts/notebase-column\";\nimport { notebaseRowContract } from \"./contracts/notebase-row\";\nimport { speechContract } from \"./contracts/speech\";\nimport { srsContract } from \"./contracts/srs\";\nimport { statsContract } from \"./contracts/stats\";\nimport { userContract } from \"./contracts/user\";\nimport { videoTranscriptContract } from \"./contracts/video-transcript\";\n\nexport const contract = {\n billing: billingContract,\n card: cardContract,\n cardTemplate: cardTemplateContract,\n ebook: ebookContract,\n emailPreferences: emailPreferencesContract,\n featureAccess: featureAccessContract,\n hostedAi: hostedAiContract,\n masteryGoal: masteryGoalContract,\n mcpConnection: mcpConnectionContract,\n notebase: notebaseContract,\n notebaseColumn: notebaseColumnContract,\n notebaseRow: notebaseRowContract,\n speech: speechContract,\n srs: srsContract,\n stats: statsContract,\n user: userContract,\n videoTranscript: videoTranscriptContract,\n};\n\nexport type ORPCRouterClient = ContractRouterClient<typeof contract>;\n\nexport { type AgentRoute, defineAgentProcedure } from \"./contracts/shared\";\nexport * from \"./public-errors\";\nexport * from \"./schemas/app-locale\";\nexport * from \"./schemas/billing\";\nexport * from \"./schemas/card\";\nexport * from \"./schemas/ebook\";\nexport * from \"./schemas/email-preferences\";\nexport * from \"./schemas/feature-access\";\nexport * from \"./schemas/hosted-ai\";\nexport * from \"./schemas/mastery-goal\";\nexport * from \"./schemas/mcp-connection\";\nexport * from \"./schemas/notebase\";\nexport * from \"./schemas/notebase-column\";\nexport * from \"./schemas/notebase-row\";\nexport * from \"./schemas/notebase-stats\";\nexport * from \"./schemas/notebase-view\";\nexport * from \"./schemas/speech\";\nexport * from \"./schemas/srs\";\nexport * from \"./schemas/srs-stats\";\nexport * from \"./schemas/stats\";\nexport * from \"./schemas/timezone\";\nexport * from \"./schemas/user\";\nexport * from \"./schemas/video-transcript\";\n\nexport * from \"./schemas/pagination\";\nexport * from \"./schemas/resource-mutation\";\n"],"mappings":";;;;;;;;;AAOA,MAAa,kBAAkB,EAAE,KAAK;CAAC;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;AAAO,CAAC;;;ACH/F,MAAa,wBAAwB,EAAE,KAAK,CAAC,SAAS,MAAM,CAAC;AAG7D,MAAa,kCAAkC,EAAE,KAAK;CACpD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAGD,MAAa,oBAAoB,EAAE,KAAK;CAAC;CAAQ;CAAO;AAAO,CAAC;;;;;;;;;;;AAahE,MAAa,wBAAwB;CACnC,MAAM;CACN,KAAK;CACL,OAAO;AACT;AAGA,MAAa,4BAA4B,EAAE,KAAK,CAAC,OAAO,OAAO,CAAC;AAGhE,MAAa,wBAAwB,EAAE,KAAK;CAAC;CAAO;CAAO;AAAK,CAAC;AAKjE,MAAa,sBAAsB;AAGnC,MAAa,4BAA4B,EAAE,KAAK,CAAC,gBAAgB,MAAM,CAAC;AAGxE,MAAa,+BAA+B,EACzC,OAAO;CACN,MAAM;CACN,UAAU;CACV,aAAa,EAAE,OAAO,KAAK;AAC7B,CAAC,CAAC,CACD,OAAO;;;;;;AAQV,MAAa,gCAAgC;;;;;;AAO7C,MAAa,0BAA0B,EACpC,OAAO;;CAEN,OAAO,EAAE,OAAO,KAAK;;;;;CAKrB,MAAM;;CAEN,KAAK,EAAE,IAAI,CAAC,CAAC,SAAS;AACxB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,sBAAsB,EAChC,OAAO;CACN,MAAM;CACN,QAAQ,gCAAgC,SAAS;CACjD,UAAU,sBAAsB,SAAS;CACzC,kBAAkB,EAAE,OAAO,KAAK,CAAC,CAAC,SAAS;;;;;;;CAO3C,UAAU,EAAE,OAAO,KAAK,CAAC,CAAC,SAAS;CACnC,cAAc,0BAA0B,SAAS;CACjD,iBAAiB,6BAA6B,SAAS;CACvD,YAAY,wBAAwB,SAAS;CAC7C,wBAAwB,EAAE,QAAQ;CAClC,mBAAmB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS;CAC7C,mBAAmB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,0CAA0C,EACpD,OAAO;CACN,UAAU;CACV,UAAU;CACV,QAAQ;CACR,MAAM,0BAA0B,QAAQ,KAAK;AAC/C,CAAC,CAAC,CACD,OAAO;AAKV,MAAa,gDAAgD,EAC1D,OAAO,EACN,QAAQ,gBACV,CAAC,CAAC,CACD,OAAO;AAKV,MAAa,gCAAgC,EAC1C,OAAO,EACN,KAAK,EAAE,IAAI,EACb,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,2CAA2C,EACrD,OAAO,EACN,SAAS,EAAE,QAAQ,IAAI,EACzB,CAAC,CAAC,CACD,OAAO;;;AC7IV,MAAa,gCAAgC,EAAE,KAAK,CAAC,UAAU,QAAQ,CAAC;AAExE,MAAa,4BAA4B,EAAE,aAAa;CACtD,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;CACrC,MAAM;AACR,CAAC;AAED,MAAM,6BAA6B,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAK;;;;;;AAOrE,MAAa,0BAA0B,EAAE,KAAK,CAAC,UAAU,SAAS,CAAC;;;;;;;;;AASnE,MAAa,wBAAwB,EAAE,KAAK;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AACD,MAAa,0BAA0B,EAAE,KAAK;AAE9C,MAAM,gCAAgC;;;;;;;;;;;CAWpC,WAAW,wBAAwB,QAAQ,QAAQ;CACnD,WAAW,wBAAwB,SAAS;AAC9C;AAEA,MAAa,gCAAgC,EAAE,aAAa;CAC1D,GAAG;CACH,cAAc;CACd,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAK;CAC1C,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;AACjD,CAAC;AAED,MAAa,4CAA4C,EACtD,aAAa;CACZ,GAAG;CACH,cAAc;CACd,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAK;CAC1C,cAAc,EAAE,MAAM,yBAAyB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;CAC9D,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;AACjD,CAAC,CAAC,CACD,aAAa,OAAO,QAAQ;CAC3B,MAAM,6BAAa,IAAI,IAAY;CAEnC,MAAM,aAAa,SAAS,OAAO,UAAU;EAC3C,IAAI,WAAW,IAAI,MAAM,IAAI,GAAG;GAC9B,IAAI,SAAS;IACX,MAAM;IACN,SAAS,iCAAiC,MAAM,KAAK;IACrD,MAAM;KAAC;KAAgB;KAAO;IAAM;GACtC,CAAC;GACD;EACF;EAEA,WAAW,IAAI,MAAM,IAAI;CAC3B,CAAC;AACH,CAAC;AAEH,MAAa,sCAAsC;AACnD,MAAa,4CAA4C;AAEzD,MAAa,0CAA0C,EAAE,aAAa;CACpE,GAAG;CACH,cAAc;CACd,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAK;CAC1C,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;AACjD,CAAC;;;;;;;;;AAUD,MAAa,qCAAqC,EAAE,aAAa;CAC/D,QAAQ,EAAE,aAAa;EACrB,2BAA2B,EAAE,QAAQ;EACrC,gBAAgB,EAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS;;;;;;;EAO7C,kBAAkB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS;CAChD,CAAC;CACD,OAAO,EACJ,MACC,EAAE,aAAa,EACb,QAAQ,EACL,MACC,EAAE,aAAa;EACb,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE;EACvB,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;CACpD,CAAC,CACH,CAAC,CACA,IAAA,EAA6C,EAClD,CAAC,CACH,CAAC,CACA,IAAA,CAAuC;AAC5C,CAAC;AAED,MAAa,2BAA2B,EAAE,YAAY,EACpD,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAC/B,CAAC;;;;;;;;;;;;AAaD,MAAa,qCAAqC;CAChD;CACA;CACA;CACA;CACA;CACA;AACF;;;;;;;AAQA,MAAa,4BAA4B,EAAE,OAAO,CAAC,CAAC;;;;;;AAOpD,MAAa,kCAAkC,EAAE,KAAK;CACpD;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;AAMD,MAAa,4BAA4B,kBAAkB,QAAQ,CAAC,MAAM,CAAC;AAE3E,MAAa,+BAA+B,EAAE,KAAK;CACjD;CACA;CACA;CACA;AACF,CAAC;AAED,MAAa,iCAAiC,EAAE,KAAK,CAAC,SAAS,QAAQ,CAAC;AAExE,MAAa,2BAA2B,EAAE,KAAK,CAAC,SAAS,MAAM,CAAC;;;;;;;;;;;;;;AAehE,MAAa,mCAAmC,EAAE,OAAO;CACvD,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;CACpC,YAAY;AACd,CAAC;;;;;;;;;;;AAYD,MAAa,sCAAsC,EAAE,aAAa;CAChE,YAAY;CACZ,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;CACtC,SAAS,EAAE,IAAI,SAAS,CAAC,CAAC,SAAS;;;;;;CAMnC,UAAU,EAAE,MAAM,qBAAqB,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;;;;;;;;AASD,MAAa,oCAAoC,EAAE,aAAa;CAC9D,YAAY,EAAE,QAAQ,MAAM;CAC5B,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;CACtC,WAAW,EAAE,IAAI,SAAS;CAC1B,UAAU,EAAE,MAAM,qBAAqB,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC;;;;;;AAOD,MAAa,iCAAiC,EAAE,mBAAmB,cAAc,CAC/E,qCACA,iCACF,CAAC;AAED,MAAa,2BAA2B,EAAE,aAAa;CACrD,eAAe,EAAE,QAAQ;CACzB,WAAW,EAAE,QAAQ;CACrB,mBAAmB,gCAAgC,SAAS;;;;;;;CAO5D,WAAW,0BAA0B,SAAS;;;;;;;;CAQ9C,eAAe,EAAE,QAAQ;CACzB,eAAe,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,MAAa,8BAA8B,EAAE,aAAa;CACxD,QAAQ;CACR,SAAS;AACX,CAAC;AAED,MAAa,6BAA6B,EAAE,aAAa;;;;;;;;;CASvD,SAAS,EAAE,MAAM,mCAAmC;;;;;;CAMpD,OAAO,EAAE,MAAM,8BAA8B;CAC7C,UAAU,EAAE,aAAa;EACvB,iBAAiB;EACjB,cAAc;EACd,gBAAgB;EAChB,sBAAsB;EACtB,gBAAgB;EAChB,kBAAkB;EAClB,mBAAmB;CACrB,CAAC;AACH,CAAC;;;ACtSD,MAAa,oCAAoC,EAAE,KAAK;CACtD;CACA;CACA;CACA;AACF,CAAC;AAGD,MAAa,qCAAqC,EAC/C,OAAO;CACN,gBAAgB,EAAE,OAAO,CAAC,CAAC,SAAS;CACpC,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS;CAClC,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS;CAClC,eAAe,EAAE,QAAQ,CAAC,CAAC,SAAS;CACpC,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;AAC7C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO;CACN,kBAAkB,EAAE,OAAO;CAC3B,SAAS;CACT,QAAQ;;CAER,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;AAC7C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,uCAAuC,EACjD,OAAO,EACN,mBAAmB,EAAE,MAAM,EAAE,OAAO,CAAC,EACvC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,sCAAsC,EAChD,OAAO,EACN,QAAQ,EAAE,MACR,EACG,OAAO;CACN,MAAM,EAAE,KAAK,CAAC,SAAS,MAAM,CAAC;CAC9B,SAAS,EAAE,OAAO;CAElB,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;CACvC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;AACvC,CAAC,CAAC,CACD,OAAO,CACZ,EACF,CAAC,CAAC,CACD,OAAO;AAIV,MAAa,4CAA4C,EACtD,OAAO,EACN,WAAW,EAAE,MAAM,EAAE,OAAO;CAAE,IAAI,EAAE,KAAK;CAAG,MAAM,EAAE,OAAO;AAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAC1E,CAAC,CAAC,CACD,OAAO;AAKV,MAAa,mCAAmC,EAAE,aAAa;CAC7D,WAAW;;CAEX,WAAW;AACb,CAAC;AAED,MAAa,mCAAmC,EAAE,aAAa;CAC7D,WAAW;CAKX,UAAU;CACV,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;CACtC,SAAS,EAAE,IAAI,SAAS,CAAC,CAAC,SAAS;AACrC,CAAC;AAED,MAAa,oCAAoC,EAAE,aAAa;CAC9D,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;CAC7B,SAAS,EAAE,IAAI,SAAS;AAC1B,CAAC;AAED,MAAa,wBAAwB;CACnC,0BAA0B;EACxB,SAAS;EACT,QAAQ;CACV;CACA,yBAAyB;EAAE,SAAS;EAA2C,QAAQ;CAAI;CAC3F,+BAA+B;EAC7B,SAAS;EACT,QAAQ;CACV;CACA,2BAA2B;EACzB,MAAM;EACN,SAAS;EACT,QAAQ;CACV;CACA,2BAA2B;EACzB,MAAM;EACN,SAAS;EACT,QAAQ;CACV;CACA,oBAAoB;EAClB,SAAS;EACT,QAAQ;CACV;CACA,2CAA2C;EACzC,SAAS;EACT,QAAQ;CACV;CAMA,sCAAsC;EACpC,SAAS;EACT,QAAQ;CACV;CACA,4BAA4B;EAC1B,SAAS;EACT,QAAQ;CACV;CACA,4BAA4B;EAC1B,SAAS;EACT,QAAQ;CACV;CACA,oCAAoC;EAClC,SAAS;EACT,QAAQ;CACV;CAIA,wCAAwC;EACtC,SAAS;EACT,QAAQ;CACV;CAEA,4BAA4B;EAC1B,MAAM;EACN,SAAS;EACT,QAAQ;CACV;CAEA,oBAAoB;EAClB,SAAS;EACT,QAAQ;CACV;CACA,2BAA2B;EACzB,SAAS;EACT,QAAQ;CACV;CACA,wBAAwB;EACtB,SAAS;EACT,QAAQ;CACV;CACA,gBAAgB;EACd,SAAS;EACT,QAAQ;CACV;CACA,yBAAyB;EACvB,SAAS;EACT,QAAQ;CACV;CACA,wCAAwC;EACtC,MAAM;EACN,SAAS;EACT,QAAQ;CACV;CACA,8BAA8B;EAC5B,MAAM;EACN,SAAS;EACT,QAAQ;CACV;CACA,sCAAsC;EACpC,MAAM;EACN,SAAS;EACT,QAAQ;CACV;CACA,qBAAqB;EACnB,SAAS;EACT,QAAQ;CACV;CACA,wBAAwB;EACtB,SAAS;EACT,QAAQ;CACV;CACA,4BAA4B;EAC1B,SAAS;EACT,QAAQ;CACV;CACA,qBAAqB;EACnB,SAAS;EACT,QAAQ;CACV;CACA,0BAA0B;EACxB,SAAS;EACT,QAAQ;CACV;CACA,qBAAqB;EACnB,SAAS;EACT,QAAQ;CACV;CACA,yBAAyB;EACvB,SAAS;EACT,QAAQ;CACV;CACA,kCAAkC;EAChC,SAAS;EACT,QAAQ;CACV;CACA,qBAAqB;EACnB,SAAS;EACT,QAAQ;CACV;CACA,iBAAiB;EACf,SAAS;EACT,QAAQ;CACV;CACA,wBAAwB;EACtB,SAAS;EACT,QAAQ;CACV;CACA,oBAAoB;EAClB,SAAS;EACT,QAAQ;CACV;CACA,gCAAgC;EAC9B,SAAS;EACT,QAAQ;CACV;CACA,yBAAyB;EACvB,SAAS;EACT,QAAQ;CACV;CACA,wBAAwB;EACtB,MAAM;EACN,SAAS;EACT,QAAQ;CACV;CACA,4CAA4C;EAC1C,SAAS;EACT,QAAQ;CACV;CACA,8BAA8B;EAC5B,SAAS;EACT,QAAQ;CACV;CACA,uBAAuB;EACrB,SAAS;EACT,QAAQ;CACV;CACA,iBAAiB;EACf,SAAS;EACT,QAAQ;CACV;CACA,sBAAsB;EACpB,SAAS;EACT,QAAQ;CACV;CACA,sBAAsB;EACpB,SAAS;EACT,QAAQ;CACV;CACA,4BAA4B;EAC1B,SAAS;EACT,QAAQ;CACV;CAGA,oBAAoB;EAClB,SAAS;EACT,QAAQ;CACV;AACF;AASA,SAAgB,qBAAqB,MAAsD;CACzF,OAAO,SAAS,KAAA,KAAa,QAAQ;AACvC;AAEA,SAAgB,yBAA2D,MAAa;CACtF,OAAO,sBAAsB;AAC/B;AAEA,SAAgB,mBACd,GAAG,OACH;CACA,OAAO,OAAO,YACZ,MAAM,KAAK,SAAS;EAClB,MAAM,aAAa,sBAAsB;EAEzC,IAAI,UAAU,YACZ,OAAO,CACL,MACA;GACE,MAAM,WAAW;GACjB,SAAS,WAAW;GACpB,QAAQ,WAAW;EACrB,CACF;EAGF,OAAO,CACL,MACA;GACE,SAAS,WAAW;GACpB,QAAQ,WAAW;EACrB,CACF;CACF,CAAC,CACH;AACF;;;ACvUA,MAAM,mBAAmB,GAAG,OAC1B,mBACE,0BACA,8BACA,uBACA,0BACF,CACF;AAEA,MAAa,kBAAkB;CAC7B,QAAQ,iBACL,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,SAAS;CAClB,CAAC,CAAC,CACD,OAAO,mBAAmB;CAC7B,uBAAuB,iBACpB,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,SAAS;CAClB,CAAC,CAAC,CACD,MAAM,uCAAuC,CAAC,CAC9C,OAAO,6BAA6B;CACvC,6BAA6B,iBAC1B,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,SAAS;CAClB,CAAC,CAAC,CACD,MAAM,6CAA6C,CAAC,CACpD,OAAO,6BAA6B;CACvC,uBAAuB,iBACpB,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,SAAS;CAClB,CAAC,CAAC,CACD,OAAO,wCAAwC;AACpD;;;;;;;;;;;;ACnCA,SAAgB,qBAAqB,OAAmB;CACtD,OAAO,GAAG,MAAM;EAAE,SAAS,MAAM;EAAS,aAAa,MAAM;CAAY,CAAC,CAAC,CAAC,MAAM,KAAK;AACzF;;;ACpBA,MAAa,kBAAkB;CAE7B,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS;CACjD,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;AAC3C;AACA,SAAgB,WAAgC,YAAe;CAC7D,OAAO,EAAE,OAAO;EAAE,OAAO,EAAE,MAAM,UAAU;EAAG,SAAS,EAAE,QAAQ;CAAE,CAAC;AACtE;;;ACPA,MAAa,0BAA0B,EAAE,IAAI,SAAS,EAAE,QAAQ,KAAK,CAAC;AACtE,MAAa,uBAAuB,EAAE,OAAO;CAC3C,IAAI,EAAE,KAAK;CACX,MAAM,EAAE,OAAO;AACjB,CAAC;;;ACUD,MAAa,qBAAqB,EAAE,OAAO;CACzC,IAAI,EAAE,KAAK;CACX,YAAY,EAAE,KAAK;CACnB,MAAM,EAAE,OAAO;CACf,QAAQ;CACR,WAAW,4BAA4B,SACrC,0HACF;CACA,WAAW,EAAE,OAAO,KAAK;CACzB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC;AAGD,MAAa,8BAA8B,EAAE,OAAO;CAClD,GAAG;CACH,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS;AAChC,CAAC;AAGD,MAAa,+BAA+B,WAAW,kBAAkB;AAGzE,MAAa,6BAA6B,EAAE,OAAO,EACjD,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,8BAA8B;AAG3C,MAAa,gCAAgC,EAC1C,OAAO;CACN,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;CACtB,YAAY,EAAE,KAAK;CACnB,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,QAAQ;AACV,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,mBAAmB,OAAO,EACtE,MAAM,EAAE,OAAO,EACjB,CAAC;AAGD,MAAa,gCAAgC,EAC1C,OAAO;CACN,mBAAmB,wBAAwB,SAAS;CACpD,IAAI,EAAE,KAAK;CACX,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;CACjC,QAAQ,yBAAyB,SAAS;AAC5C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,mBAAmB,OAAO,EACtE,MAAM,EAAE,OAAO,EACjB,CAAC;AAGD,MAAa,gCAAgC,EAAE,OAAO,EACpD,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,iCAAiC;AAG9C,MAAa,aAAa,EAAE,OAAO;CACjC,GAAG;CACH,GAAG;CACH,WAAW,EAAE,OAAO,KAAK;CACzB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC;AAGD,MAAa,qBAAqB,WAAW,OAAO;CAClD,OAAO,EAAE,OAAO;CAChB,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,sBAAsB,EAAE,OAAO;CAC1C,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS;CAC9B,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS;CAC9B,gBAAgB,qBAAqB,SAAS;CAC9C,GAAG;AACL,CAAC;AAGD,MAAa,uBAAuB,WAAW,kBAAkB;AAGjE,MAAa,qBAAqB,EAAE,OAAO,EACzC,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,sBAAsB;AAGnC,MAAa,0BAA0B,EAAE,OAAO;CAC9C,YAAY,EAAE,KAAK;CACnB,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS;AAChC,CAAC;AAGD,MAAa,2BAA2B,EAAE,OAAO;CAC/C,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;CAC/B,MAAM,EAAE,OAAO;AACjB,CAAC;;;ACjHD,MAAa,eAAe;CAC1B,MAAM,qBAAqB;EACzB,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,mBAAmB,CAAC,CAC1B,OAAO,oBAAoB;CAE9B,KAAK,qBAAqB;EACxB,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACC,OAAO,mBAAmB,gBAAgB,CAAC,CAAC,CAC5C,MAAM,kBAAkB,CAAC,CACzB,OAAO,mBAAmB;CAE7B,UAAU,GACP,OAAO,mBAAmB,sBAAsB,yBAAyB,CAAC,CAAC,CAC3E,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACD,MAAM,uBAAuB,CAAC,CAC9B,OAAO,wBAAwB;AACpC;;;AChCA,MAAa,uBAAuB;CAClC,MAAM,qBAAqB;EACzB,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,gBAAgB;CACzB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,2BAA2B,CAAC,CAClC,OAAO,4BAA4B;CAEtC,KAAK,qBAAqB;EACxB,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACb,MAAM,CAAC,gBAAgB;CACzB,CAAC,CAAC,CACC,OAAO,mBAAmB,yBAAyB,CAAC,CAAC,CACrD,MAAM,0BAA0B,CAAC,CACjC,OAAO,2BAA2B;CAErC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,gBAAgB;CACzB,CAAC,CAAC,CACC,OACC,mBACE,sBACA,0CACA,8BACF,CACF,CAAC,CACA,OAAO,mBAAmB,yBAAyB,CAAC,CAAC,CACrD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CAExC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,gBAAgB;CACzB,CAAC,CAAC,CACC,OACC,mBACE,2BACA,0CACA,8BACF,CACF,CAAC,CACA,OAAO,mBAAmB,0BAA0B,CAAC,CAAC,CACtD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CAExC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,gBAAgB;CACzB,CAAC,CAAC,CACC,OAAO,mBAAmB,yBAAyB,CAAC,CAAC,CACrD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;AAC1C;;;ACrFA,MAAa,oBAAoB,EAAE,KAAK,CAAC,WAAW,OAAO,CAAC;AAG5D,MAAa,8BAA8B,EAAE,KAAK,iCAAiC;AAGnF,MAAa,sBAAsB,EAChC,OAAO;CACN,IAAI,EAAE,KAAK;CACX,OAAO,EAAE,OAAO;CAChB,QAAQ,EAAE,OAAO,CAAC,CAAC,SAAS;CAC5B,UAAU,EAAE,OAAO,CAAC,CAAC,SAAS;CAC9B,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI;CAC7B,QAAQ;CACR,kBAAkB,EAAE,OAAO;CAC3B,YAAY,EAAE,OAAO,KAAK,CAAC,CAAC,SAAS;CACrC,UAAU,EAAE,IAAI,CAAC,CAAC,SAAS;CAC3B,WAAW,EAAE,OAAO,KAAK;CACzB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,oBAAoB,oBAAoB,OAAO,EAC1D,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS,EACnC,CAAC;AAGD,MAAa,mBAAmB,EAC7B,OAAO;CACN,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;CAE7B,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AAC/B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,uBAAuB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;AAGxD,MAAa,wBAAwB,EAClC,OAAO;CACN,OAAO,EAAE,MAAM,mBAAmB;CAClC,OAAO;AACT,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,sBAAsB,EAChC,OAAO,EACN,IAAI,EAAE,KAAK,EACb,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,uBAAuB,EACjC,OAAO,EACN,OAAO,kBACT,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,gCAAgC,EAC1C,OAAO;CACN,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;CAChC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS;CACrC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS;CAEtC,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;CACpC,OAAO,EACJ,OAAO;EACN,aAAa;EACb,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;CAClC,CAAC,CAAC,CACD,OAAO,CAAC,CACR,SAAS;AACd,CAAC,CAAC,CACD,OAAO;;;;;AAOV,MAAa,6BAA6B,EACvC,OAAO;CACN,KAAK,EAAE,IAAI;CACX,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAC1C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO;CACN,SAAS,EAAE,KAAK;CAChB,QAAQ;CACR,aAAa,2BAA2B,SAAS;CACjD,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO,EACN,SAAS,EAAE,KAAK,EAClB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,kCAAkC,EAC5C,OAAO,EACN,OAAO,oBACT,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO,EACN,IAAI,EAAE,KAAK,EACb,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,kCAAkC,EAC5C,OAAO;CACN,KAAK,EAAE,IAAI;CACX,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,gCAAgC,EAC1C,OAAO;CACN,KAAK,EAAE,OAAO,CAAC,CAAC,IAAI,GAAI;CACxB,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,8BAA8B,OAAO,EACjF,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,kCAAkC,EAC5C,OAAO,EACN,YAAY,EAAE,OAAO,KAAK,EAC5B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,wBAAwB,EAClC,OAAO;CACN,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG;CAChC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS;AAClD,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,yBAAyB,sBAAsB,OAAO,EACjE,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,0BAA0B,EACpC,OAAO,EACN,OAAO,oBACT,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,yBAAyB,EACnC,OAAO,EACN,IAAI,EAAE,KAAK,EACb,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,0BAA0B,EACpC,OAAO,EACN,IAAI,EAAE,KAAK,EACb,CAAC,CAAC,CACD,OAAO;;;ACpKV,MAAM,iBAAiB;AAEvB,MAAa,gBAAgB;CAC3B,MAAM,eACH,OAAO,mBAAmB,uBAAuB,CAAC,CAAC,CACnD,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,oBAAoB,CAAC,CAC3B,OAAO,qBAAqB;CAE/B,KAAK,eACF,OAAO,mBAAmB,yBAAyB,iBAAiB,CAAC,CAAC,CACtE,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,mBAAmB,CAAC,CAC1B,OAAO,oBAAoB;CAE9B,eAAe,eACZ,OACC,mBAAmB,yBAAyB,wBAAwB,sBAAsB,CAC5F,CAAC,CACA,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CAExC,gBAAgB,eACb,OACC,mBACE,yBACA,mBACA,8BACA,sBACF,CACF,CAAC,CACA,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,8BAA8B,CAAC,CACrC,OAAO,+BAA+B;CAEzC,gBAAgB,eACb,OAAO,mBAAmB,yBAAyB,iBAAiB,CAAC,CAAC,CACtE,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,8BAA8B,CAAC,CACrC,OAAO,+BAA+B;CAEzC,gBAAgB,eACb,OAAO,mBAAmB,yBAAyB,iBAAiB,CAAC,CAAC,CACtE,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,8BAA8B,CAAC,CACrC,OAAO,+BAA+B;CAEzC,QAAQ,eACL,OAAO,mBAAmB,yBAAyB,iBAAiB,CAAC,CAAC,CACtE,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,sBAAsB,CAAC,CAC7B,OAAO,uBAAuB;CAEjC,QAAQ,eACL,OAAO,mBAAmB,yBAAyB,iBAAiB,CAAC,CAAC,CACtE,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,sBAAsB,CAAC,CAC7B,OAAO,uBAAuB;AACnC;;;;AC/GA,MAAa,yBAAyB,EACnC,OAAO,CAAC,CACR,IAAI,EAAE,CAAC,CACP,MAAM,mBAAmB;;AAI5B,MAAa,uBAAuB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI;AAE9D,MAAa,2BAA2B,EACrC,OAAO;CACN,KAAK,EAAE,OAAO;CAEd,MAAM,EAAE,OAAO;CACf,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;CAEjC,YAAY,EAAE,QAAQ;CAItB,UAAU,EAAE,QAAQ;CAEpB,YAAY,EAAE,QAAQ;AACxB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,8BAA8B,EACxC,OAAO;CAEN,YAAY,EAAE,MAAM,wBAAwB;CAC5C,iBAAiB,EAAE,QAAQ;AAC7B,CAAC,CAAC,CACD,OAAO;;;;;AAOV,MAAa,qCAAqC,EAC/C,OAAO;CACN,GAAG,4BAA4B;CAC/B,aAAa,EAAE,OAAO;CAGtB,mBAAmB,EAAE,OAAO,CAAC,CAAC,SAAS;AACzC,CAAC,CAAC,CACD,OAAO;AAGV,MAAM,+BAA+B;CAKnC,YAAY,EAAE,OAAO,wBAAwB,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS;CAInE,iBAAiB,EAAE,QAAQ,CAAC,CAAC,SAAS;AACxC;AAEA,MAAa,iCAAiC,EAC3C,OAAO,EACN,QAAQ,gBACV,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,oCAAoC,EAC9C,OAAO;CACN,QAAQ;CACR,GAAG;AACL,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,wCAAwC,EAClD,OAAO;CACN,OAAO;CACP,QAAQ;AACV,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,2CAA2C,EACrD,OAAO;CACN,OAAO;CACP,QAAQ;CACR,GAAG;AACL,CAAC,CAAC,CACD,OAAO;;;ACxFV,MAAa,2BAA2B;CACtC,KAAK,GACF,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,mBAAmB;CAC5B,CAAC,CAAC,CACD,MAAM,8BAA8B,CAAC,CACrC,OAAO,2BAA2B;CACrC,QAAQ,GACL,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,mBAAmB;CAC5B,CAAC,CAAC,CACD,MAAM,iCAAiC,CAAC,CACxC,OAAO,2BAA2B;CAGrC,YAAY,GACT,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,mBAAmB;CAC5B,CAAC,CAAC,CACD,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,qCAAqC,CAAC,CAC5C,OAAO,kCAAkC;CAC5C,eAAe,GACZ,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,mBAAmB;CAC5B,CAAC,CAAC,CACD,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,wCAAwC,CAAC,CAC/C,OAAO,kCAAkC;AAC9C;;;ACnDA,MAAa,wBAAwB,EAAE,KAAK,kBAAkB;AAG9D,MAAa,iCAAiC,EAC3C,OAAO,EACN,YAAY,sBACd,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,kCAAkC,EAAE,OAAO;CACtD,YAAY;CACZ,SAAS,EAAE,QAAQ;AACrB,CAAC;;;ACVD,MAAa,wBAAwB,EACnC,QAAQ,GACL,MAAM;CACL,QAAQ;CACR,MAAM;CACN,SAAS;CACT,MAAM,CAAC,gBAAgB;AACzB,CAAC,CAAC,CACD,MAAM,8BAA8B,CAAC,CACrC,OAAO,+BAA+B,EAC3C;;;ACLA,MAAM,uBAAuB,mBAC3B,6BACA,2BACF;AAEA,MAAa,mBAAmB;CAC9B,QAAQ,GACL,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,yBAAyB,CAAC,CAChC,OAAO,0BAA0B;CACpC,WAAW,EACT,YAAY,GACT,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB,EAChC;CACA,sBAAsB,EACpB,YAAY,GACT,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB,EAChC;CACA,gBAAgB;EAGd,YAAY,GACT,MAAM;GACL,QAAQ;GACR,MAAM;GACN,SAAS;GACT,MAAM,CAAC,WAAW;EACpB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB;;;;;;;;EAQ9B,oBAAoB,GACjB,MAAM;GACL,QAAQ;GACR,MAAM;GACN,SAAS;GACT,MAAM,CAAC,WAAW;EACpB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB;CAChC;CACA,kBAAkB,EAChB,YAAY,GACT,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB,EAChC;CACA,mBAAmB,EAIjB,YAAY,GACT,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB,EAChC;CACA,cAAc,EACZ,wBAAwB,GACrB,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,yCAAyC,CAAC,CAChD,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB,EAChC;CACA,gBAAgB,EACd,wBAAwB,GACrB,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,uCAAuC,CAAC,CAC9C,OAAO,cAAc,wBAAwB,CAAC,CAAC,CAC/C,OAAO,oBAAoB,EAChC;AACF;;;AClIA,MAAa,0BAA0B;;AAGvC,MAAa,0BAA0B,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,uBAAuB;;AAI1F,MAAa,+BAA+B,EACzC,OAAO,EACN,QAAQ,wBAAwB,SAAS,EAC3C,CAAC,CAAC,CACD,OAAO;;AAIV,MAAa,0BAA0B,EACpC,OAAO,EACN,QAAQ,wBAAwB,SAAS,EAC3C,CAAC,CAAC,CACD,OAAO;;;AClBV,MAAa,sBAAsB;CACjC,KAAK,GACF,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACD,OAAO,uBAAuB;CACjC,QAAQ,GACL,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACD,MAAM,4BAA4B,CAAC,CACnC,OAAO,uBAAuB;AACnC;;;ACnBA,MAAa,sBAAsB,EAChC,OAAO;;CAEN,UAAU,EAAE,OAAO;;CAEnB,YAAY,EAAE,OAAO,CAAC,CAAC,SAAS;CAChC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;CAC1B,yBAAyB,EAAE,MAAM,EAAE,OAAO,CAAC;CAC3C,WAAW,EAAE,KAAK,CAAC,CAAC,SAAS;CAC7B,WAAW,EAAE,KAAK,CAAC,CAAC,SAAS;;;;;;CAM7B,kBAAkB,EAAE,KAAK,CAAC,CAAC,SAAS;AACtC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,gCAAgC,EAAE,MAAM,mBAAmB;AAExE,MAAa,iCAAiC,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO;AAG/F,MAAa,kCAAkC,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO;;;ACpBzF,MAAa,wBAAwB;CACnC,MAAM,GACH,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,iBAAiB;CAC1B,CAAC,CAAC,CACD,OAAO,6BAA6B;CACvC,QAAQ,GACL,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,iBAAiB;CAC1B,CAAC,CAAC,CACD,MAAM,8BAA8B,CAAC,CACrC,OAAO,+BAA+B;AAC3C;;;ACjBA,MAAa,4BAA4B,EACtC,OAAO,CAAC,CACR,IAAI,CAAC,CACL,IAAI,yBAAyB,CAAC,CAC9B,IAAI,yBAAyB;AAEhC,MAAa,uBAAuB,EAAE,OAAO;CAC3C,IAAI,EAAE,OAAO;CACb,YAAY,EAAE,OAAO;CACrB,MAAM,EAAE,OAAO;CACf,QAAQ;CACR,UAAU,EAAE,OAAO;CACnB,WAAW,EAAE,QAAQ;CACrB,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,MAAM,EAAE,QAAQ;CAChB,WAAW,EAAE,OAAO,KAAK;CACzB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC;AAGD,MAAa,iCAAiC,EAC3C,OAAO;CACN,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;CACtB,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,QAAQ;AACV,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO;CACN,mBAAmB,wBAAwB,SAAS;CACpD,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;CACjC,QAAQ,2BAA2B,SAAS;CAC5C,OAAO,0BAA0B,SAAS,CAAC,CAAC,SAAS;CACrD,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS;AAC7B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,kCAAkC,EAAE,OAAO;CACtD,YAAY,EAAE,KAAK;CACnB,MAAM;AACR,CAAC;AAGD,MAAa,mCAAmC,EAAE,OAAO;CACvD,OAAO;CACP,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,kCAAkC,EAAE,OAAO;CACtD,kBAAkB,EAAE,KAAK;CACzB,MAAM;AACR,CAAC;AAGD,MAAa,mCAAmC,EAAE,OAAO;CACvD,OAAO;CACP,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,kCAAkC,EAAE,OAAO,EACtD,kBAAkB,EAAE,KAAK,EAC3B,CAAC;AAGD,MAAa,mCAAmC;AAGhD,MAAa,mCAAmC,EAAE,OAAO;CACvD,YAAY,EAAE,KAAK;CACnB,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;AACvB,CAAC;AAGD,MAAa,oCAAoC,EAAE,OAAO,EACxD,MAAM,EAAE,OAAO,EACjB,CAAC;;;ACpFD,MAAa,yBAAyB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC;AAEtE,MAAa,oBAAoB,EAAE,OAAO;CACxC,IAAI,EAAE,OAAO;CACb,YAAY,EAAE,OAAO;CACrB,OAAO;CACP,UAAU,EAAE,OAAO;CACnB,WAAW,EAAE,OAAO,KAAK;CACzB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC;AAGD,MAAa,8BAA8B,EACxC,OAAO;CACN,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;CACtB,OAAO,uBAAuB,SAAS;AACzC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,8BAA8B,EACxC,OAAO;CACN,OAAO,uBAAuB,SAAS;CACvC,mBAAmB,wBAAwB,SAAS;AACtD,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,+BAA+B,EAAE,OAAO;CACnD,YAAY,EAAE,KAAK;CACnB,MAAM;AACR,CAAC;AAGD,MAAa,gCAAgC,EAAE,OAAO;CACpD,MAAM;CACN,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,oCAAoC;AAEjD,MAAa,mCAAmC,EAC7C,OAAO;CACN,YAAY,EAAE,KAAK;CACnB,MAAM,EAAE,MAAM,2BAA2B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,EAAqC;AACzF,CAAC,CAAC,CACD,aAAa,OAAO,QAAQ;CAC3B,MAAM,0BAAU,IAAI,IAAY;CAEhC,MAAM,KAAK,SAAS,KAAK,UAAU;EACjC,IAAI,IAAI,OAAO,KAAA,GACb;EAGF,IAAI,QAAQ,IAAI,IAAI,EAAE,GAAG;GACvB,IAAI,SAAS;IACX,MAAM;IACN,SAAS,qBAAqB,IAAI,GAAG;IACrC,MAAM;KAAC;KAAQ;KAAO;IAAI;GAC5B,CAAC;GACD;EACF;EAEA,QAAQ,IAAI,IAAI,EAAE;CACpB,CAAC;AACH,CAAC;AAGH,MAAa,oCAAoC,EAAE,OAAO;CACxD,OAAO,EAAE,MAAM,iBAAiB;CAChC,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,+BAA+B,EAAE,OAAO;CACnD,eAAe,EAAE,KAAK;CACtB,MAAM;AACR,CAAC;AAGD,MAAa,gCAAgC,EAAE,OAAO;CACpD,IAAI,EAAE,KAAK;CACX,YAAY,EAAE,KAAK;CACnB,OAAO;CACP,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI;CACzB,WAAW,EAAE,KAAK;CAClB,WAAW,EAAE,KAAK;CAClB,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,oCAAoC;AAEjD,MAAa,mCAAmC,EAC7C,OAAO;CACN,YAAY,EAAE,KAAK;CACnB,MAAM,EACH,MACC,EAAE,OAAO;EACP,IAAI,EAAE,KAAK;EACX,MAAM;CACR,CAAC,CACH,CAAC,CACA,IAAI,CAAC,CAAC,CACN,IAAA,EAAqC;AAC1C,CAAC,CAAC,CACD,aAAa,OAAO,QAAQ;CAC3B,MAAM,0BAAU,IAAI,IAAY;CAChC,MAAM,KAAK,SAAS,KAAK,UAAU;EACjC,IAAI,QAAQ,IAAI,IAAI,EAAE,GACpB,IAAI,SAAS;GACX,MAAM;GACN,SAAS,qBAAqB,IAAI,GAAG;GACrC,MAAM;IAAC;IAAQ;IAAO;GAAI;EAC5B,CAAC;EAEH,QAAQ,IAAI,IAAI,EAAE;CACpB,CAAC;AACH,CAAC;AAGH,MAAa,oCAAoC,EAAE,OAAO;CACxD,OAAO,EAAE,MAAM,iBAAiB;CAChC,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,+BAA+B,EAAE,OAAO,EACnD,eAAe,EAAE,KAAK,EACxB,CAAC;AAGD,MAAa,gCAAgC;AAG7C,MAAa,oCAAoC;AAEjD,MAAa,mCAAmC,EAC7C,OAAO,EACN,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,EAAqC,EACrE,CAAC,CAAC,CACD,aAAa,OAAO,QAAQ;CAC3B,MAAM,0BAAU,IAAI,IAAY;CAChC,MAAM,IAAI,SAAS,IAAI,UAAU;EAC/B,IAAI,QAAQ,IAAI,EAAE,GAChB,IAAI,SAAS;GACX,MAAM;GACN,SAAS,qBAAqB,GAAG;GACjC,MAAM,CAAC,OAAO,KAAK;EACrB,CAAC;EAEH,QAAQ,IAAI,EAAE;CAChB,CAAC;AACH,CAAC;AAGH,MAAa,oCAAoC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;AAGpF,MAAa,gCAAgC,EAAE,OAAO;CACpD,YAAY,EAAE,KAAK;CACnB,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC;AACvB,CAAC;AAGD,MAAa,iCAAiC,EAAE,OAAO,EACrD,MAAM,EAAE,OAAO,EACjB,CAAC;AAGD,MAAa,6BAA6B,EACvC,OAAO;CACN,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS;CAI9B,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS;CAClD,GAAG;AACL,CAAC,CAAC,CAKD,QAAQ,UAAU,MAAM,UAAU,KAAA,KAAa,MAAM,eAAe,KAAA,GAAW;CAC9E,OAAO;CACP,MAAM,CAAC,YAAY;AACrB,CAAC;AAEH,MAAa,8BAA8B,WAAW,iBAAiB;AACvE,MAAa,4BAA4B,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAClE,MAAa,6BAA6B;;;ACjM1C,MAAa,yBAAyB,EAAE,KAAK;CAAC;CAAS;CAAU;AAAS,CAAC;AAG3E,MAAa,2BAA2B,EACrC,OAAO;CACN,sBAAsB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CAChE,uBAAuB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;CACpD,yBAAyB,EAAE,OAAO,CAAC,CAAC,SAAS;AAC/C,CAAC,CAAC,CACD,SAAS,EAAE,QAAQ,CAAC;AAGvB,MAAa,2BAA2B,EACrC,OAAO;CACN,kBAAkB,EAAE,OAAO;CAC3B,UAAU,EAAE,OAAO;CACnB,OAAO,EAAE,QAAQ;AACnB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,4BAA4B,EAAE,MAAM,wBAAwB;AAEzE,MAAa,yBAAyB,EACnC,OAAO;CACN,kBAAkB,EAAE,OAAO;CAC3B,WAAW,EAAE,KAAK,CAAC,OAAO,MAAM,CAAC;AACnC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,0BAA0B,EAAE,MAAM,sBAAsB;AAErE,MAAa,+BAA+B,EACzC,OAAO;CACN,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;CACtB,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,MAAM;CACN,QAAQ,yBAAyB,SAAS;CAC1C,SAAS,0BAA0B,SAAS;CAC5C,OAAO,wBAAwB,SAAS;AAC1C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,+BAA+B,EACzC,OAAO;CACN,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;CACjC,MAAM,uBAAuB,SAAS;CACtC,QAAQ,yBAAyB,SAAS;CAC1C,SAAS,0BAA0B,SAAS;CAC5C,OAAO,wBAAwB,SAAS;AAC1C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,qBAAqB,EAAE,OAAO;CACzC,IAAI,EAAE,OAAO;CACb,YAAY,EAAE,OAAO;CACrB,MAAM,EAAE,OAAO;CACf,MAAM;CACN,QAAQ,yBAAyB,SAAS;CAC1C,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS;CACvC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS;CACrC,UAAU,EAAE,OAAO;CACnB,WAAW,EAAE,OAAO,KAAK;CACzB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC;;;ACzDD,MAAa,0BAA0B,EAAE,OAAO,CAAC,CAAC;AAGlD,MAAa,wBAAwB,EAAE,OAAO;CAC5C,IAAI,EAAE,OAAO;CACb,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,yBAAyB;AAGtC,MAAa,2BAA2B,EAAE,MAAM,sBAAsB;AAGtE,MAAa,iBAAiB,EAAE,OAAO;CACrC,IAAI,EAAE,OAAO;CACb,QAAQ,EAAE,OAAO;CACjB,MAAM,EAAE,OAAO;CACf,cAAc,sBAAsB;CACpC,kBAAkB,sBAAsB;CACxC,qBAAqB,sBAAsB;CAC3C,oBAAoB,sBAAsB;CAC1C,oBAAoB,sBAAsB;CAC1C,kBAAkB,sBAAsB;CACxC,oBAAoB,sBAAsB;CAC1C,mBAAmB,sBAAsB;CACzC,eAAe,sBAAsB;CACrC,YAAY,iBAAiB,SAAS;CAEtC,iBAAiB;CAEjB,eAAe,EAAE,KAAK,CAAC,CAAC,SAAS;CACjC,WAAW,EAAE,KAAK;CAClB,WAAW,EAAE,KAAK;AACpB,CAAC;AAGD,MAAM,2BAA2B,EAC9B,OAAO;CACN,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;CACtB,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC;AACzC,CAAC,CAAC,CACD,OAAO;AAEV,MAAa,2BAA2B,EACrC,OAAO;CACN,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;CACtB,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CACtB,SAAS,EACN,OAAO;EACN,gBAAgB,EACb,MACC,EACG,OAAO;GACN,IAAI,EAAE,KAAK;GACX,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;GACtB,QAAQ;EACV,CAAC,CAAC,CACD,OAAO,CACZ,CAAC,CACA,IAAI,CAAC;EACR,YAAY,yBAAyB,SAAS;EAC9C,aAAa,EACV,MAAM,wBAAwB,CAAC,CAC/B,IAAI,CAAC,CAAC,CACN,IAAA,EAAqC,CAAC,CACtC,SAAS;CACd,CAAC,CAAC,CACD,OAAO,CAAC,CACR,aAAa,SAAS,QAAQ;EAC7B,IAAI,QAAQ,cAAc,QAAQ,aAChC,IAAI,SAAS;GACX,MAAM;GACN,SAAS;GACT,MAAM,CAAC,aAAa;EACtB,CAAC;EAGH,IAAI,CAAC,QAAQ,aACX;EAGF,MAAM,0BAAU,IAAI,IAAY;EAChC,QAAQ,YAAY,SAAS,KAAK,UAAU;GAC1C,IAAI,IAAI,OAAO,KAAA,GACb;GAGF,IAAI,QAAQ,IAAI,IAAI,EAAE,GAAG;IACvB,IAAI,SAAS;KACX,MAAM;KACN,SAAS,qBAAqB,IAAI,GAAG;KACrC,MAAM;MAAC;MAAe;MAAO;KAAI;IACnC,CAAC;IACD;GACF;GAEA,QAAQ,IAAI,IAAI,EAAE;EACpB,CAAC;CACH,CAAC,CAAC,CACD,SAAS;AACd,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,4BAA4B;AAGzC,MAAa,6BAA6B,EAAE,OAAO;CACjD,UAAU;CACV,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,2BAA2B,EACrC,OAAO;CACN,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;CACjC,cAAc,sBAAsB,UAAU,SAAS;CACvD,kBAAkB,sBAAsB,cAAc,SAAS;CAC/D,qBAAqB,sBAAsB,iBAAiB,SAAS;AACvE,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,4BAA4B,yBAAyB,OAAO,EACvE,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,6BAA6B,EAAE,OAAO;CACjD,UAAU;CACV,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,8BAA8B,EACxC,OAAO;CACN,IAAI,EAAE,KAAK;CACX,SAAS,EAAE,QAAQ;AACrB,CAAC,CAAC,CACD,OAAO;AAIV,MAAa,+BAA+B,EAAE,OAAO,EACnD,MAAM,EAAE,OAAO,CAAC,CAAC,SAAS,EAC5B,CAAC;AAGD,MAAa,4BAA4B,EAAE,OAAO,EAChD,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,6BAA6B;AAI1C,MAAa,yBAAyB,EAAE,OAAO,EAC7C,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,gCAAgC,EAAE,OAAO,EACpD,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,iCAAiC,sBAAsB,OAAO;CACzE,cAAc,sBAAsB;CACpC,kBAAkB,sBAAsB;CACxC,qBAAqB,sBAAsB;CAC3C,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY;AAC1C,CAAC;AAGD,MAAa,+BAA+B,EAAE,OAAO,EACnD,IAAI,EAAE,KAAK,EACb,CAAC;AAGD,MAAa,0BAA0B,eAAe,OAAO;CAC3D,WAAW,EAAE,OAAO,KAAK;CACzB,WAAW,EAAE,OAAO,KAAK;CACzB,iBAAiB,EAAE,MAAM,oBAAoB;CAC7C,cAAc,EAAE,MAAM,iBAAiB;CACvC,eAAe,EAAE,MAAM,kBAAkB;AAC3C,CAAC;AAGD,MAAa,gCAAgC,EAAE,OAAO;CACpD,IAAI,EAAE,OAAO;CACb,MAAM,EAAE,OAAO;CACf,WAAW,EAAE,OAAO,KAAK;CACzB,iBAAiB,EAAE,MAAM,oBAAoB;AAC/C,CAAC;;;AC1LD,MAAa,mBAAmB;CAC9B,MAAM,qBAAqB;EACzB,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aAAa;EACb,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACC,MAAM,uBAAuB,CAAC,CAC9B,OAAO,wBAAwB;CAElC,YAAY,qBAAqB;EAC/B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CAExC,KAAK,GACF,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACD,MAAM,sBAAsB,CAAC,CAC7B,OAAO,uBAAuB;CAEjC,WAAW,qBAAqB;EAC9B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,4BAA4B,CAAC,CACnC,OAAO,6BAA6B;CAEvC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACC,OAAO,mBAAmB,uBAAuB,wBAAwB,CAAC,CAAC,CAC3E,OAAO,mBAAmB,yBAAyB,CAAC,CAAC,CACrD,MAAM,yBAAyB,CAAC,CAChC,OAAO,0BAA0B;CAEpC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,yBAAyB,CAAC,CAChC,OAAO,0BAA0B;CAEpC,UAAU,qBAAqB;EAC7B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,2BAA2B,CAAC,CAClC,OAAO,4BAA4B;CAEtC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,WAAW;CACpB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,yBAAyB,CAAC,CAChC,OAAO,0BAA0B;AACtC;;;ACtGA,MAAa,yBAAyB;CACpC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,kBAAkB;CAC3B,CAAC,CAAC,CACC,OAAO,mBAAmB,sBAAsB,8BAA8B,CAAC,CAAC,CAChF,OAAO,mBAAmB,yBAAyB,CAAC,CAAC,CACrD,MAAM,+BAA+B,CAAC,CACtC,OAAO,gCAAgC;CAE1C,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,kBAAkB;CAC3B,CAAC,CAAC,CACC,OAAO,mBAAmB,2BAA2B,CAAC,CAAC,CACvD,OAAO,mBAAmB,4BAA4B,+BAA+B,CAAC,CAAC,CACvF,MAAM,+BAA+B,CAAC,CACtC,OAAO,gCAAgC;CAE1C,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,kBAAkB;CAC3B,CAAC,CAAC,CACC,OACC,mBACE,6BACA,8CACA,wCACA,8BACF,CACF,CAAC,CACA,MAAM,+BAA+B,CAAC,CACtC,OAAO,gCAAgC;CAE1C,SAAS,GACN,OAAO,mBAAmB,sBAAsB,8BAA8B,CAAC,CAAC,CAChF,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,kBAAkB;CAC3B,CAAC,CAAC,CACD,MAAM,gCAAgC,CAAC,CACvC,OAAO,iCAAiC;AAC7C;;;AC5CA,MAAa,sBAAsB;CACjC,MAAM,qBAAqB;EACzB,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,0BAA0B,CAAC,CACjC,OAAO,2BAA2B;CACrC,KAAK,qBAAqB;EACxB,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OAAO,mBAAmB,wBAAwB,CAAC,CAAC,CACpD,MAAM,yBAAyB,CAAC,CAChC,OAAO,0BAA0B;CACpC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OACC,mBACE,sBACA,0BACA,gCACA,qBACF,CACF,CAAC,CACA,OAAO,mBAAmB,yBAAyB,CAAC,CAAC,CACrD,MAAM,4BAA4B,CAAC,CACnC,OAAO,6BAA6B;CAEvC,YAAY,qBAAqB;EAC/B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OACC,mBACE,sBACA,0BACA,gCACA,qBACF,CACF,CAAC,CACA,OAAO,mBAAmB,yBAAyB,CAAC,CAAC,CACrD,MAAM,gCAAgC,CAAC,CACvC,OAAO,iCAAiC;CAE3C,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OAAO,mBAAmB,0BAA0B,wBAAwB,CAAC,CAAC,CAC9E,OAAO,mBAAmB,0BAA0B,CAAC,CAAC,CACtD,MAAM,4BAA4B,CAAC,CACnC,OAAO,6BAA6B;CAEvC,YAAY,qBAAqB;EAC/B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OACC,mBAAmB,sBAAsB,0BAA0B,wBAAwB,CAC7F,CAAC,CACA,OAAO,mBAAmB,0BAA0B,CAAC,CAAC,CACtD,MAAM,gCAAgC,CAAC,CACvC,OAAO,iCAAiC;CAE3C,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OAAO,mBAAmB,0BAA0B,8BAA8B,CAAC,CAAC,CACpF,MAAM,4BAA4B,CAAC,CACnC,OAAO,6BAA6B;CAEvC,YAAY,qBAAqB;EAC/B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACC,OAAO,mBAAmB,0BAA0B,8BAA8B,CAAC,CAAC,CACpF,MAAM,gCAAgC,CAAC,CACvC,OAAO,iCAAiC;CAE3C,SAAS,GACN,OAAO,mBAAmB,sBAAsB,8BAA8B,CAAC,CAAC,CAChF,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,eAAe;CACxB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;AAC1C;;;;AC/IA,MAAa,yBAAyB;;;;;;AAOtC,MAAa,8BAA8B;CACzC,MAAM;CACN,KAAK;CACL,OAAO;AACT;;AAGA,MAAa,wBAAwB,EAClC,OAAO,CAAC,CACR,IAAI,GAAG,CAAC,CACR,MAAM,kDAAkD;AAG3D,MAAa,kBAAkB;AAC/B,MAAa,kBAAkB;;AAG/B,MAAa,mBAAmB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAA,GAAmB,CAAC,CAAC,IAAA,GAAmB;;;;;;AAOzF,MAAa,0BAA0B,EACpC,OAAO;CACN,gBAAgB,EAAE,cAAc,uBAAuB,qBAAqB;CAE5E,mBAAmB,sBAAsB,SAAS;CAClD,MAAM;AACR,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,6BAAgD;CAC3D,gBAAgB,CAAC;CACjB,mBAAmB;CACnB,MAAM;AACR;;;;;AAMA,MAAa,qCAAqC,EAC/C,OAAO;CACN,gBAAgB,EACb,cAAc,uBAAuB,sBAAsB,SAAS,CAAC,CAAC,CACtE,SAAS;CACZ,mBAAmB,sBAAsB,SAAS,CAAC,CAAC,SAAS;CAC7D,MAAM,iBAAiB,SAAS;AAClC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,0BAA0B,EAAE,KAAK;CAAC;CAAU;CAAQ;AAAS,CAAC;AAG3E,MAAa,oBAAoB,EAC9B,OAAO;CACN,MAAM;CAEN,aAAa,EAAE,OAAO;CACtB,QAAQ,EAAE,OAAO;CAEjB,UAAU,sBAAsB,SAAS;CACzC,QAAQ;CAER,cAAc,EAAE,QAAQ;AAC1B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,2BAA2B,EACrC,OAAO;CACN,QAAQ,EAAE,MAAM,iBAAiB;CAEjC,eAAe,EAAE,cAAc,uBAAuB,qBAAqB;CAC3E,0BAA0B;AAC5B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,8BAA8B,EACxC,OAAO;CACN,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,GAA0B;CAGzD,UAAU,sBAAsB,SAAS;CAGzC,OAAO,sBAAsB,SAAS;AACxC,CAAC,CAAC,CACD,OAAO;;;;;AAOV,MAAa,+BAA+B,EACzC,OAAO;CACN,KAAK,EAAE,IAAI;CACX,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC,CAAC,CACD,OAAO;;;AC/GV,MAAa,iBAAiB;CAC5B,gBAAgB,GACb,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,OAAO,uBAAuB;CACjC,mBAAmB,GAChB,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,kCAAkC,CAAC,CACzC,OAAO,uBAAuB;CACjC,YAAY,GACT,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,OAAO,wBAAwB;CAClC,YAAY,GACT,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,QAAQ;CACjB,CAAC,CAAC,CACD,MAAM,2BAA2B,CAAC,CAClC,OAAO,4BAA4B;AACxC;;;ACnCA,MAAM,qCAAqB,IAAI,IAAiC;AAIhE,SAAS,WAAW,UAAkB;CACpC,OAAO,SAAS,QAAQ,WAAW,WAAW,OAAO,YAAY,CAAC;AACpE;AAEA,SAAS,qBAAqB,UAAuC;CACnE,MAAM,MAAM,WAAW,QAAQ;CAC/B,MAAM,SAAS,mBAAmB,IAAI,GAAG;CACzC,IAAI,QACF,OAAO;CAGT,MAAM,YAAY,IAAI,KAAK,eAAe,SAAS,EAAE,UAAU,SAAS,CAAC;CACzE,MAAM,YAAY,UAAU,gBAAgB,CAAC,CAAC;CAC9C,IAAI,UAAU,WAAW,GAAG,KAAK,UAAU,WAAW,GAAG,GACvD,OAAO;CAGT,MAAM,eAAe,WAAW,SAAS;CACzC,MAAM,SAAS,mBAAmB,IAAI,YAAY,KAAK;CACvD,mBAAmB,IAAI,cAAc,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM;CAC5D,OAAO;AACT;AAEA,MAAa,iBAAiB,EAC3B,OAAO,CAAC,CACR,KAAK,CAAC,CACN,IAAI,CAAC,CAAC,CACN,QAAQ,aAAa;CACpB,IAAI;EACF,qBAAqB,QAAQ,CAAC,CAAC,uBAAO,IAAI,KAAK,CAAC;EAChD,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF,GAAG,kBAAkB;;;;;;;;AAUvB,MAAa,0BAA0B,eAAe,WAAW,UAAU,QAAQ;CACjF,MAAM,OAAO,kBAAkB,QAAQ;CACvC,IAAI,CAAC,MAAM;EACT,IAAI,SAAS;GACX,MAAM;GACN,SACE;EACJ,CAAC;EACD,OAAO,EAAE;CACX;CACA,OAAO;AACT,CAAC;;;AC9CD,MAAa,aAAa;AAG1B,MAAa,iCAAiC;AAC9C,MAAM,8BAA8B;AACpC,MAAM,6BAA6B;AAOnC,eAAsB,wBAAwB,MAA6B;CACzE,OAAO,OACL,GAAG,4BAA4B,GAAG,KAAK,GAAG,GAAG,qBAAqB,KAAK,cAAc,KACrF,8BACF;AACF;AAEA,MAAa,uBAAuB,EACjC,OAAO;CACN,QAAQ,EAAE,KAAK;CACf,IAAI,EAAE,KAAK,CAAC,CAAC,SAAS;CACtB,QAAQ;CACR,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,0BAA0B;CAClE,UAAU;AACZ,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,+BAA+B,EACzC,OAAO;CACN,kBAAkB,EAAE,KAAK,CAAC,CAAC,SAAS;CACpC,QAAQ,EAAE,KAAK;AACjB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,+BAA+B,EAAE,OAC5C,4BACA,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CACxB;AAGA,MAAa,oCAAoC,EAC9C,OAAO;CACN,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS;CACxC,UAAU;AACZ,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,qCAAqC,EAAE,OAAO,EAAE,KAAK,GAAG,4BAA4B;AAGjG,MAAa,kDAAkD,EAC5D,OAAO,EACN,UAAU,wBACZ,CAAC,CAAC,CACD,OAAO;;AAMV,MAAa,mDAAmD,EAC7D,OAAO;CACN,UAAU;CACV,OAAO;AACT,CAAC,CAAC,CACD,SAAS;AAKZ,MAAa,iCAAiC,EAC3C,OAAO;CACN,QAAQ,EAAE,KAAK;CACf,SAAS,EAAE,QAAQ;AACrB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,8BAA8B;AAG3C,MAAa,iCAAiC;AAG9C,MAAa,kBAAkB,EAAE,OAAO;CACtC,IAAI,EAAE,KAAK;CACX,YAAY,EAAE,KAAK;CACnB,QAAQ,EAAE,KAAK;CACf,QAAQ;CACR,OAAOA;CACP,WAAW,EAAE,OAAO;CACpB,qBAAqBC;CACrB,kBAAkB;CAClB,iBAAiB,EAAE,OAAO,CAAC,CAAC,YAAY;CACxC,sBAAsB,EAAE,OAAO,CAAC,CAAC,YAAY;CAC7C,YAAY,EAAE,OAAO,KAAK;CAC1B,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI;CAC3B,uBAAuB;CACvB,WAAW,EAAE,OAAO,KAAK;AAC3B,CAAC;AAGD,MAAa,iCAAiC,gBAAgB,KAAK,EACjE,uBAAuB,KACzB,CAAC;AAGD,MAAa,gCAAgC,EAC1C,OAAO;CACN,GAAG;CACH,YAAY,EAAE,KAAK,CAAC,CAAC,SAAS;CAC9B,QAAQ,EAAE,KAAK,CAAC,CAAC,SAAS;AAC5B,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO;CACN,OAAO,EAAE,MAAM,8BAA8B;CAC7C,SAAS,EAAE,QAAQ;AACrB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,wBAAwB,EAAE,OAAO;CAC5C,MAAM;CACN,QAAQ;CACR,MAAM,EAAE,OAAO;CAEf,SAAS,EAAE,QAAQ;AACrB,CAAC;AAGD,MAAa,gCAAgC,EAAE,OAAO;CACpD,MAAM;CACN,oBAAoB,EAAE,KAAK;CAC3B,MAAM,EAAE,OAAO;AACjB,CAAC;AAGD,MAAa,sBAAsB,EAAE,OAAO,EAC1C,MAAM,EAAE,OAAO,EACjB,CAAC;AAGD,MAAa,+BAA+B;AAG5C,MAAa,kCAAkC;AAG/C,MAAa,2CAA2C,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;AAE5E,MAAa,iCAAiC,EAC3C,OAAO;CACN,OAAO,EAAE,KAAK;CACd,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC;CAC9B,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS;CACvC,aAAa,EAAE,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS;AACjD,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,4CAA4C,EAAE,MAAM,8BAA8B;AAK/F,MAAa,4CAA4C,EACtD,OAAO,EACN,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EACjC,CAAC,CAAC,CACD,OAAO;AAKV,MAAa,6CAA6C,EACvD,OAAO,EACN,mBAAmB,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAClD,CAAC,CAAC,CACD,OAAO;AAKV,SAAS,qBAAqB,gBAAsC;CAClE,OAAO,iBAAiB,IAAI,KAAK,cAAc,CAAC,CAAC,YAAY,IAAI;AACnE;AAEA,eAAe,OAAO,MAAc,WAAmB;CACrD,MAAM,iBAAiB,YAAY,SAAS;CAC5C,MAAM,YAAY,IAAI,YAAY,CAAC,CAAC,OAAO,IAAI;CAC/C,MAAM,QAAQ,IAAI,WAAW,eAAe,SAAS,UAAU,MAAM;CACrE,MAAM,IAAI,cAAc;CACxB,MAAM,IAAI,WAAW,eAAe,MAAM;CAG1C,MAAM,QAAQ,IADG,WAAW,MAAM,OAAO,OAAO,OAAO,SAAS,KAAK,CACpD,CAAC,CAAC,MAAM,GAAG,EAAE;CAC9B,MAAM,cAAc,MAAM;CAC1B,MAAM,cAAc,MAAM;CAC1B,IAAI,gBAAgB,KAAA,KAAa,gBAAgB,KAAA,GAC/C,MAAM,IAAI,MAAM,4BAA4B;CAE9C,MAAM,KAAM,cAAc,KAAQ;CAClC,MAAM,KAAM,cAAc,KAAQ;CAElC,OAAO,YAAY,KAAK;AAC1B;AAEA,SAAS,YAAY,MAAc;CACjC,MAAM,MAAM,KAAK,WAAW,KAAK,EAAE,CAAC,CAAC,YAAY;;CAEjD,IAAI,CAAC,iBAAiB,KAAK,GAAG,GAC5B,MAAM,IAAI,MAAM,wBAAwB;CAG1C,OAAO,IAAI,WACT,MAAM,KAAK,EAAE,QAAQ,GAAG,IAAI,GAAG,UAC7B,OAAO,SAAS,IAAI,MAAM,QAAQ,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,CACzD,CACF;AACF;AAEA,SAAS,YAAY,OAAmB;CACtC,MAAM,MAAM,MAAM,KAAK,QAAQ,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC;CAC1E,OAAO;EACL,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;EACvB,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;EACvB,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE;EACvB,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE;EACxB,IAAI,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE;CAC3B,CAAC,CAAC,KAAK,GAAG;AACZ;;;AC5OA,MAAa,cAAc;CACzB,qBAAqB,qBAAqB;EACxC,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACC,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM,iCAAiC,CAAC,CACxC,OAAO,kCAAkC;CAC5C,mCAAmC,GAChC,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACD,MAAM,+CAA+C,CAAC,CACtD,OAAO,gDAAgD;CAC1D,4BAA4B,GACzB,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACD,MAAM,wCAAwC,CAAC,CAC/C,OAAO,yCAAyC;CAEnD,6BAA6B,GAC1B,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACD,MAAM,yCAAyC,CAAC,CAChD,OAAO,0CAA0C;CAEpD,iBAAiB,qBAAqB;EACpC,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACC,OAAO,mBAAmB,kBAAkB,oBAAoB,CAAC,CAAC,CAClE,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CAExC,QAAQ,qBAAqB;EAC3B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACC,OAAO,mBAAmB,kBAAkB,uBAAuB,yBAAyB,CAAC,CAAC,CAC9F,MAAM,oBAAoB,CAAC,CAC3B,OAAO,qBAAqB;CAC/B,gBAAgB,qBAAqB;EACnC,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACC,OACC,mBACE,kBACA,oCACA,yBACF,CACF,CAAC,CACA,MAAM,4BAA4B,CAAC,CACnC,OAAO,6BAA6B;CACvC,eAAe,qBAAqB;EAClC,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACC,OACC,mBACE,kBACA,uBACA,mBACA,gCACF,CACF,CAAC,CACA,MAAM,2BAA2B,CAAC,CAClC,OAAO,4BAA4B;CACtC,kBAAkB,qBAAqB;EACrC,QAAQ;EACR,MAAM;EACN,SAAS;EACT,aACE;EACF,MAAM,CAAC,KAAK;CACd,CAAC,CAAC,CACC,OACC,mBACE,kBACA,0BACA,sBACA,gCACF,CACF,CAAC,CACA,MAAM,8BAA8B,CAAC,CACrC,OAAO,+BAA+B;AAC3C;;;AC7IA,MAAa,kCAAkC,EAC5C,OAAO;CACN,MAAM,EAAE,IAAI,KAAK;CACjB,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY;AACtC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,oCAAoC,EAC9C,OAAO,EACN,OAAO,EAAE,MAAM,+BAA+B,EAChD,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,mCAAmC,EAC7C,OAAO;CACN,MAAM,EAAE,IAAI,KAAK;CACjB,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI;AACxB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,qCAAqC,EAC/C,OAAO;CACN,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY;CACxC,OAAO,EAAE,MAAM,gCAAgC;AACjD,CAAC,CAAC,CACD,OAAO;;;AC5BV,MAAa,6BAA6B,EACvC,OAAO;CACN,MAAM,EAAE,IAAI,KAAK;CACjB,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY;CACtC,YAAY,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY;AAC3C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,+BAA+B,EACzC,OAAO;CACN,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY;CAC3C,OAAO,EAAE,MAAM,0BAA0B;AAC3C,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO;CACN,MAAM,EAAE,IAAI,KAAK;CACjB,OAAO,EAAE,OAAO,CAAC,CAAC,IAAI;AACxB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,mCAAmC,EAC7C,OAAO;CACN,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY;CACxC,OAAO,EAAE,MAAM,8BAA8B;AAC/C,CAAC,CAAC,CACD,OAAO;;;AC3BV,MAAM,yBAAyB,EAC5B,MAAM,EAAE,KAAK,CAAC,CAAC,CACf,IAAI,CAAC,CAAC,CACN,WAAW,QAAQ,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC;AAE9C,MAAa,mBAAmB,EAC7B,OAAO;CACN,aAAa,uBAAuB,SAAS;CAC7C,MAAM,EAAE,IAAI,KAAK,CAAC,CAAC,SAAS;CAC5B,IAAI,EAAE,IAAI,KAAK;CACf,UAAU;AACZ,CAAC,CAAC,CACD,OAAO,CAAC,CACR,QAAQ,UAAU,CAAC,MAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI;CACxD,SAAS;CACT,MAAM,CAAC,MAAM;AACf,CAAC;AAGH,MAAa,4BAA4B,EACtC,OAAO;CACN,KAAK;CACL,UAAU;AACZ,CAAC,CAAC,CACD,OAAO;;;ACvBV,MAAa,gBAAgB;CAC3B,UAAU,GACP,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,YAAY;CACrB,CAAC,CAAC,CACD,MAAM,gBAAgB,CAAC,CACvB,OAAO,yBAAyB;CAEnC,iBAAiB,GACd,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,YAAY;CACrB,CAAC,CAAC,CACD,MAAM,gBAAgB,CAAC,CACvB,OAAO,gCAAgC;CAE1C,mBAAmB,GAChB,OAAO,mBAAmB,oBAAoB,CAAC,CAAC,CAChD,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,YAAY;CACrB,CAAC,CAAC,CACD,MAAM,gBAAgB,CAAC,CACvB,OAAO,kCAAkC;AAC9C;;;ACnCA,MAAa,gCAAgC,EAC1C,OAAO,EACN,UAAU,eACZ,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO;CACN,UAAU;CACV,SAAS,EAAE,QAAQ;AACrB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,gCAAgC,EAC1C,OAAO,EACN,UAAU,eACZ,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,iCAAiC,EAC3C,OAAO,EACN,UAAU,eACZ,CAAC,CAAC,CACD,OAAO;AAMV,MAAa,8BAA8B,EACxC,OAAO,EACN,QAAQ,gBACV,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,+BAA+B,EACzC,OAAO;CACN,QAAQ;CACR,SAAS,EAAE,QAAQ;AACrB,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,8BAA8B,EACxC,OAAO,EACN,QAAQ,gBACV,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,+BAA+B,EACzC,OAAO,EACN,QAAQ,gBACV,CAAC,CAAC,CACD,OAAO;;;AClDV,MAAa,eAAe;CAC1B,gBAAgB,GACb,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CACxC,gBAAgB,GACb,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CACxC,cAAc,GACX,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACD,MAAM,2BAA2B,CAAC,CAClC,OAAO,4BAA4B;CACtC,cAAc,GACX,MAAM;EACL,QAAQ;EACR,MAAM;EACN,SAAS;EACT,MAAM,CAAC,OAAO;CAChB,CAAC,CAAC,CACD,MAAM,2BAA2B,CAAC,CAClC,OAAO,4BAA4B;AACxC;;;AC7CA,MAAa,8BAA8B,EAAE,KAAK;CAAC;CAAW;CAAc;CAAa;AAAQ,CAAC;AAIlG,MAAa,gCAAgC,EAAE,OAAO;CACpD,IAAI,EAAE,OAAO;CACb,UAAU,EAAE,OAAO;CACnB,SAAS,EAAE,OAAO;CAClB,KAAK,EAAE,OAAO;CACd,QAAQ;CACR,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,aAAa,EAAE,OAAO,CAAC,CAAC,SAAS;CACjC,kBAAkB,EAAE,OAAO,CAAC,CAAC,SAAS;CACtC,OAAO,EAAE,OAAO,CAAC,CAAC,SAAS;CAC3B,WAAW,EAAE,KAAK;CAClB,WAAW,EAAE,KAAK;AACpB,CAAC;AAID,MAAa,iCAAiC,EAAE,OAAO;CACrD,IAAI,EAAE,OAAO;CACb,kBAAkB,EAAE,OAAO,CAAC,CAAC,SAAS;CACtC,UAAU,EAAE,MAAM,uBAAuB;AAC3C,CAAC;AAGD,MAAa,mCAAmC,EAC7C,OAAO;CACN,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,QAAQ,kBAAkB,GAAG,MAAM,MAAM,EAC5D,SAAS,oCACX,CAAC;CAMD,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS;AACzC,CAAC,CAAC,CACD,OAAO;AAGV,MAAa,gCAAgC,EAC1C,OAAO,EACN,IAAI,EAAE,KAAK,EACb,CAAC,CAAC,CACD,OAAO;AAQV,MAAa,iCAAiC,EAAE,OAAO;CACrD,IAAI,EAAE,OAAO;CACb,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI;CAC5B,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI;CAC7B,kBAAkB,EAAE,OAAO,CAAC,CAAC,IAAI;CACjC,SAAS,EAAE,IAAI,SAAS,CAAC,CAAC,SAAS;CACnC,WAAW,EAAE,IAAI,SAAS,CAAC,CAAC,SAAS;AACvC,CAAC;AAQD,MAAa,6BAA6B,EAAE,OAAO;CACjD,aAAa,EAAE,OAAO,CAAC,CAAC,IAAI;CAC5B,cAAc,EAAE,OAAO,CAAC,CAAC,IAAI;CAC7B,kBAAkB,EAAE,OAAO,CAAC,CAAC,IAAI;CACjC,MAAM;CACN,OAAO,EAAE,MAAM,8BAA8B;AAC/C,CAAC;;;AE5DD,MAAa,WAAW;CACtB,SAAS;CACT,MAAM;CACN,cAAc;CACd,OAAO;CACP,kBAAkB;CAClB,eAAe;CACf,UAAU;CACV,aAAa;CACb,eAAe;CACf,UAAU;CACV,gBAAgB;CAChB,aAAa;CACb,QAAQ;CACR,KAAK;CACL,OAAO;CACP,MAAM;CACN,iBAAiB;EDzBjB,QAAQ,GACL,OACC,mBACE,sCACA,6CACA,wCACA,wCACF,CACF,CAAC,CACA,MAAM;GACL,QAAQ;GACR,MAAM;GACN,SAAS;GACT,MAAM,CAAC,qBAAqB;EAC9B,CAAC,CAAC,CACD,MAAM,gCAAgC,CAAC,CACvC,OAAO,6BAA6B;EACvC,UAAU,GACP,MAAM;GACL,QAAQ;GACR,MAAM;GACN,SAAS;GACT,MAAM,CAAC,qBAAqB;EAC9B,CAAC,CAAC,CACD,OAAO,0BAA0B;EACpC,KAAK,GACF,OACC,mBAAmB,8BAA8B,2CAA2C,CAC9F,CAAC,CACA,MAAM;GACL,QAAQ;GACR,MAAM;GACN,SAAS;GACT,MAAM,CAAC,qBAAqB;EAC9B,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,6BAA6B;EACvC,cAAc,GACX,OACC,mBACE,8BACA,8BACA,2CACF,CACF,CAAC,CACA,MAAM;GACL,QAAQ;GACR,MAAM;GACN,SAAS;GACT,MAAM,CAAC,qBAAqB;EAC9B,CAAC,CAAC,CACD,MAAM,6BAA6B,CAAC,CACpC,OAAO,8BAA8B;CC3BvB;AACnB"}
|