@helloao/cli 0.2.0 → 0.3.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/README.md +2 -0
- package/dist/cjs/cli.cjs +2772 -6200
- package/dist/cjs/index.cjs +2694 -6253
- package/dist/esm/cli.js +5699 -0
- package/dist/esm/cli.js.map +7 -0
- package/dist/esm/index.js +839 -6020
- package/dist/esm/index.js.map +4 -4
- package/dist/types/actions.d.ts +36 -1
- package/dist/types/db.d.ts +12 -8
- package/dist/types/ebible.d.ts +1 -1
- package/dist/types/files.d.ts +6 -1
- package/dist/types/prisma-gen/browser.d.ts +110 -0
- package/dist/types/prisma-gen/client.d.ts +129 -0
- package/dist/types/prisma-gen/commonInputTypes.d.ts +378 -0
- package/dist/types/prisma-gen/enums.d.ts +2 -0
- package/dist/types/prisma-gen/internal/class.d.ts +353 -0
- package/dist/types/prisma-gen/internal/prismaNamespace.d.ts +2273 -0
- package/dist/types/prisma-gen/internal/prismaNamespaceBrowser.d.ts +294 -0
- package/dist/types/prisma-gen/models/Book.d.ts +2197 -0
- package/dist/types/prisma-gen/models/Chapter.d.ts +1934 -0
- package/dist/types/prisma-gen/models/ChapterAudioTiming.d.ts +1414 -0
- package/dist/types/prisma-gen/models/ChapterAudioUrl.d.ts +1414 -0
- package/dist/types/prisma-gen/models/ChapterFootnote.d.ts +1642 -0
- package/dist/types/prisma-gen/models/ChapterVerse.d.ts +1653 -0
- package/dist/types/prisma-gen/models/ChapterWords.d.ts +1366 -0
- package/dist/types/prisma-gen/models/Commentary.d.ts +1711 -0
- package/dist/types/prisma-gen/models/CommentaryBook.d.ts +1622 -0
- package/dist/types/prisma-gen/models/CommentaryChapter.d.ts +1487 -0
- package/dist/types/prisma-gen/models/CommentaryChapterVerse.d.ts +1514 -0
- package/dist/types/prisma-gen/models/CommentaryProfile.d.ts +1451 -0
- package/dist/types/prisma-gen/models/Dataset.d.ts +1667 -0
- package/dist/types/prisma-gen/models/DatasetBook.d.ts +1565 -0
- package/dist/types/prisma-gen/models/DatasetChapter.d.ts +1553 -0
- package/dist/types/prisma-gen/models/DatasetChapterVerse.d.ts +1600 -0
- package/dist/types/prisma-gen/models/DatasetReference.d.ts +1789 -0
- package/dist/types/prisma-gen/models/EBibleSource.d.ts +1686 -0
- package/dist/types/prisma-gen/models/InputFile.d.ts +1039 -0
- package/dist/types/prisma-gen/models/InputFileWarning.d.ts +946 -0
- package/dist/types/prisma-gen/models/Translation.d.ts +2238 -0
- package/dist/types/prisma-gen/models.d.ts +23 -0
- package/dist/types/s3.d.ts +2 -0
- package/dist/types/uploads.d.ts +1 -1
- package/meta/ARBNAV.json +10 -10
- package/meta/BSB.json +10 -10
- package/meta/HBOMAS.json +10 -10
- package/meta/HINIRV.json +10 -10
- package/meta/eng_dra.json +10 -10
- package/migrations/20240420231455_initial/migration.sql +66 -66
- package/migrations/20240711173108_add_chapter_audio/migration.sql +13 -13
- package/migrations/20240724212651_add_hashing/migration.sql +25 -25
- package/migrations/20250625201152_add_extra_ebible_metadata/migration.sql +3 -3
- package/migrations/20250630200532_add_apocryhpa_flag/migration.sql +2 -2
- package/migrations/20250701195337_add_file_warnings/migration.sql +8 -8
- package/migrations/20251028135135_add_datasets/migration.sql +72 -72
- package/migrations/20251028144932_fix_dataset_types/migration.sql +50 -50
- package/migrations/20260217200934_add_license_notice/migration.sql +5 -5
- package/migrations/20260703000000_add_chapter_audio_timing/migration.sql +13 -0
- package/migrations/20260809000000_add_chapter_words/migration.sql +12 -0
- package/package.json +21 -18
- package/schema.prisma +41 -2
- package/prisma-gen/default.d.ts +0 -1
- package/prisma-gen/default.js +0 -1
- package/prisma-gen/edge.d.ts +0 -1
- package/prisma-gen/edge.js +0 -403
- package/prisma-gen/index-browser.js +0 -397
- package/prisma-gen/index.d.ts +0 -34011
- package/prisma-gen/index.js +0 -426
- package/prisma-gen/runtime/edge-esm.js +0 -31
- package/prisma-gen/runtime/edge.js +0 -31
- package/prisma-gen/runtime/index-browser.d.ts +0 -365
- package/prisma-gen/runtime/index-browser.js +0 -13
- package/prisma-gen/runtime/library.d.ts +0 -3403
- package/prisma-gen/runtime/library.js +0 -143
- package/prisma-gen/runtime/react-native.js +0 -80
- package/prisma-gen/runtime/wasm.js +0 -32
- package/prisma-gen/wasm.d.ts +0 -1
- package/prisma-gen/wasm.js +0 -397
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../cli.ts", "../../downloads.ts", "../../prisma-gen/client.ts", "../../prisma-gen/internal/class.ts", "../../prisma-gen/internal/prismaNamespace.ts", "../../db.ts", "../../files.ts", "../../s3.ts", "../../uploads.ts", "../../openapi.ts", "../../actions.ts", "../../conversion.ts", "../../ebible.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport path, { extname } from 'path';\nimport { mkdir, stat, writeFile } from 'fs/promises';\nimport { exec } from 'child_process';\nimport { DOMParser, Element, Node } from 'linkedom';\nimport { downloadFile } from './downloads.js';\nimport {\n uploadApiFilesFromDatabase,\n uploadOpenApiDocument,\n} from './uploads.js';\nimport {\n askForMetadata,\n copyOpenBibleAudio,\n fetchAudio,\n generateTranslationFiles,\n generateTranslationsFiles,\n importApi,\n importAudioTimings,\n importCommentaries,\n importCommentary,\n importTranslation,\n importTranslations,\n initDb,\n listEBibleTranslations,\n sourceTranslations,\n searchTypesenseVerses,\n uploadTestTranslation,\n uploadTestTranslations,\n uploadTypesenseVerses,\n} from './actions.js';\nimport { getPrismaDb } from './db.js';\nimport { confirm, input } from '@inquirer/prompts';\nimport { log } from '@helloao/tools';\nimport { createFreeUseBibleApiOpenApiDocument } from './openapi.js';\nimport { createClient } from '@hey-api/openapi-ts';\n\nconst OPENAPI_CLIENT_LANGUAGES = [\n // ['csharp', 'csharp'],\n // ['java', 'java'],\n // ['go', 'go'],\n // ['python', 'python'],\n // ['dart', 'dart'],\n // ['swift', 'swift6'],\n ['typescript', '@hey-api/openapi-ts'],\n] as const;\n\nasync function findProjectRoot(startDir: string): Promise<string> {\n let currentDir = path.resolve(startDir);\n while (true) {\n try {\n await stat(path.resolve(currentDir, 'openapitools.json'));\n return currentDir;\n } catch {\n // Keep searching upward for the repository root marker.\n }\n\n const parent = path.dirname(currentDir);\n if (parent === currentDir) {\n throw new Error(\n 'Could not find project root (missing openapitools.json).'\n );\n }\n\n currentDir = parent;\n }\n}\n\nasync function runOpenApiGenerator(\n cwd: string,\n inputPath: string,\n generatorName: string,\n outputPath: string\n): Promise<void> {\n const executable = 'openapi-generator-cli';\n\n await new Promise<void>((resolve, reject) => {\n const child = exec(\n `${executable} generate -i \"${inputPath}\" -g \"${generatorName}\" -o \"${outputPath}\"`,\n {\n cwd,\n }\n );\n\n child.on('error', (error) => {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n reject(\n new Error(\n 'openapi-generator-cli was not found in PATH. Install it first and try again.'\n )\n );\n return;\n }\n\n reject(error);\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n reject(\n new Error(\n `openapi-generator-cli failed for language \"${generatorName}\" with exit code ${code ?? 'unknown'}.`\n )\n );\n });\n });\n}\n\nasync function applyClientPatch(\n outputPath: string,\n language: string,\n patchPath: string\n): Promise<boolean> {\n try {\n await stat(patchPath);\n } catch {\n return false;\n }\n\n await new Promise<void>((resolve, reject) => {\n const child = exec(`git apply \"${patchPath}\"`, {\n cwd: outputPath,\n });\n\n let stderr = '';\n\n child.stderr?.on('data', (chunk) => {\n stderr += String(chunk);\n });\n\n child.on('error', (error) => {\n const err = error as NodeJS.ErrnoException;\n if (err.code === 'ENOENT') {\n reject(\n new Error(\n 'git was not found in PATH. Install git first and try again.'\n )\n );\n return;\n }\n\n reject(error);\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n const details = stderr.trim();\n reject(\n new Error(\n `Failed to apply client patch for language \"${language}\" from \"${patchPath}\".${details ? `\\n${details}` : ''}`\n )\n );\n });\n });\n\n return true;\n}\n\nasync function start() {\n const parser = new DOMParser();\n globalThis.DOMParser = DOMParser as any;\n globalThis.Element = Element as any;\n globalThis.Node = Node as any;\n\n const program = new Command();\n\n program\n .name('helloao')\n .description('A CLI for managing a Free Use Bible API.')\n .option('--db <path>', 'Path to the database file.')\n .version('0.0.1');\n\n program\n .command('init [path]')\n .description('Initialize a new Bible API DB.')\n .option(\n '--source <path>',\n 'The source database to copy from. If given a HTTPS URL, then the database will be downloaded from the given URL.'\n )\n .option('--overwrite', 'Whether to overwrite the existing database.')\n .option(\n '--language <languages...>',\n 'The language(s) that the database should be initialized with.'\n )\n .action(async (dbPath: string, options: any) => {\n await initDb(dbPath, {\n ...program.opts(),\n ...options,\n });\n });\n\n program\n .command('generate-translation-metadata')\n .description('Generates a metadata file for a translation.')\n .action(async () => {\n const meta = await askForMetadata();\n\n const logger = log.getLogger();\n logger.log('Your metadata:', meta);\n\n const save = await confirm({\n message: 'Do you want to save this metadata?',\n });\n\n if (save) {\n let location = await input({\n message: 'Where would you like to save the metadata?',\n });\n\n const ext = extname(location);\n\n if (!ext) {\n if (!location.endsWith('/')) {\n location += '/';\n }\n location += 'metadata.json';\n }\n\n logger.log('Saving metadata to:', location);\n\n const dir = path.dirname(location);\n await mkdir(dir, { recursive: true });\n await writeFile(location, JSON.stringify(meta, null, 2));\n }\n });\n\n program\n .command('generate-openapi-metadata')\n .description('Generates a OpenAPI document file for the API.')\n .action(async () => {\n const document = createFreeUseBibleApiOpenApiDocument();\n\n const logger = log.getLogger();\n logger.log(\n 'Your OpenAPI document:',\n JSON.stringify(document, null, 2)\n );\n });\n\n program\n .command('generate-clients')\n .description(\n 'Generates OpenAPI clients in /clients for csharp, java, go, python, dart, swift6, and typescript-fetch.'\n )\n .action(async () => {\n const logger = log.getLogger();\n const projectRoot = await findProjectRoot(process.cwd());\n const tempDir = path.resolve(projectRoot, 'temp');\n const clientsDir = path.resolve(projectRoot, 'clients');\n const packagesDir = path.resolve(projectRoot, 'packages');\n const clientPatchesDir = path.resolve(\n projectRoot,\n 'client-patches'\n );\n const openApiPath = path.resolve(tempDir, 'openapi.json');\n\n await mkdir(tempDir, { recursive: true });\n await mkdir(clientsDir, { recursive: true });\n await mkdir(clientPatchesDir, { recursive: true });\n\n const document = createFreeUseBibleApiOpenApiDocument();\n await writeFile(openApiPath, JSON.stringify(document, null, 2), {\n encoding: 'utf-8',\n });\n\n logger.log('OpenAPI document written to:', openApiPath);\n\n for (const [language, generatorName] of OPENAPI_CLIENT_LANGUAGES) {\n const outputPath =\n language === 'typescript'\n ? path.resolve(packagesDir, 'free-use-bible-api', 'gen')\n : path.resolve(clientsDir, language);\n await mkdir(outputPath, { recursive: true });\n logger.log(\n 'Generating client:',\n language,\n 'with generator:',\n generatorName\n );\n if (generatorName === '@hey-api/openapi-ts') {\n const tsConfigPath = path.resolve(\n packagesDir,\n 'free-use-bible-api',\n 'tsconfig.json'\n );\n await createClient({\n input: openApiPath,\n output: {\n path: outputPath,\n tsConfigPath,\n module: {\n extension: '.js',\n },\n },\n plugins: [\n {\n name: '@hey-api/sdk',\n operations: {\n containerName: 'FreeUseBibleApi',\n strategy: 'single',\n methods: 'instance',\n },\n responseStyle: 'data',\n examples: {\n moduleName: 'free-use-bible-api',\n setupName: 'api',\n enabled: true,\n },\n },\n {\n name: '@hey-api/typescript',\n },\n ],\n });\n } else {\n await runOpenApiGenerator(\n projectRoot,\n openApiPath,\n generatorName,\n outputPath\n );\n }\n\n const patchPath = path.resolve(\n clientPatchesDir,\n `${language}.patch`\n );\n const patchApplied = await applyClientPatch(\n outputPath,\n language,\n patchPath\n );\n\n if (patchApplied) {\n logger.log('Applied client patch for language:', language);\n } else {\n logger.log('No client patch found for language:', language);\n }\n }\n\n logger.log('OpenAPI client generation complete.');\n });\n\n program\n .command('import-translation <dir> [dirs...]')\n .description(\n 'Imports a translation from the given directory into the database.'\n )\n .option('--overwrite', 'Whether to overwrite existing files.')\n .action(async (dir: string, dirs: string[], options: any) => {\n await importTranslation(dir, dirs, {\n ...program.opts(),\n ...options,\n });\n });\n\n program\n .command('import-translations <dir>')\n .description(\n 'Imports all translations from the given directory into the database.'\n )\n .option('--overwrite', 'Whether to overwrite existing files.')\n .action(async (dir: string, options: any) => {\n await importTranslations(dir, {\n ...program.opts(),\n ...options,\n });\n });\n\n program\n .command('import-commentary <dir> [dirs...]')\n .description(\n 'Imports a commentary from the given directory into the database.'\n )\n .option('--overwrite', 'Whether to overwrite existing files.')\n .action(async (dir: string, dirs: string[], options: any) => {\n await importCommentary(dir, dirs, {\n ...program.opts(),\n ...options,\n });\n });\n\n program\n .command('import-commentaries <dir>')\n .description(\n 'Imports all commentaries from the given directory into the database.'\n )\n .option('--overwrite', 'Whether to overwrite existing files.')\n .action(async (dir: string, options: any) => {\n await importCommentaries(dir, {\n ...program.opts(),\n ...options,\n });\n });\n\n program\n .command('import-api <dir>')\n .description('Imports API files from the given directory into the DB.')\n .option('--overwrite', 'Whether to overwrite existing files.')\n .action(async (dir: string, options: any) => {\n await importApi(dir, {\n ...program.opts(),\n ...options,\n });\n });\n\n program\n .command('import-audio-timings <file>')\n .description(\n 'Imports chapter audio timing data from the given JSON file into the database.\\nThe file should contain an array of records: { translationId, bookId, chapterNumber, reader, verses } where verses is an array of numbers (seconds) - one per verse in the chapter, in order.'\n )\n .action(async (file: string, options: any) => {\n await importAudioTimings(file, {\n ...program.opts(),\n ...options,\n });\n });\n\n program\n .command('upload-test-translation <input>')\n .description(\n `Uploads a translation to the HelloAO Free Bible API test S3 bucket.\\nRequires access to the HelloAO Free Bible API test S3 bucket.\\nFor inquiries, please contact hello@helloao.org.`\n )\n .option(\n '--batch-size <size>',\n 'The number of translations to generate API files for in each batch.',\n '50'\n )\n .option(\n '--translations <translations...>',\n 'The translations to generate API files for.'\n )\n .option('--overwrite', 'Whether to overwrite existing files.')\n .option(\n '--overwrite-common-files',\n 'Whether to overwrite only common files.'\n )\n .option(\n '--file-pattern <pattern>',\n 'The file pattern regex that should be used to filter the files that are generated.'\n )\n .option(\n '--use-common-name',\n 'Whether to use the common name for the book chapter API link. If false, then book IDs are used.'\n )\n .option(\n '--generate-audio-files',\n 'Whether to replace the audio URLs in the dataset with ones that are hosted locally.'\n )\n .option(\n '--no-generate-complete-translation-files',\n 'Whether to skip generating complete translation files.'\n )\n .option(\n '--no-generate-simple-chapter-files',\n 'Whether to skip generating simplified chapter files.'\n )\n .option(\n '--profile <profile>',\n 'The AWS profile to use for uploading to S3.'\n )\n .option(\n '--access-key-id <accessKeyId>',\n 'The AWS access key ID to use for uploading to S3.'\n )\n .option(\n '--secret-access-key <secretAccessKey>',\n 'The AWS Secret Access Key to use for uploading to S3.'\n )\n .option(\n '--s3-region <region>',\n 'The AWS region to use for uploading to S3.'\n )\n .option('--pretty', 'Whether to generate pretty-printed JSON files.')\n .option(\n '--s3-url <s3Url>',\n 'The S3 bucket URL to upload the files to.',\n 's3://ao-bible-api-public-uploads'\n )\n .action(async (input: string, options: any) => {\n const good = await confirm({\n message:\n 'Uploaded files will be publicly accessible. Continue?',\n default: false,\n });\n if (!good) {\n return;\n }\n\n const result = await uploadTestTranslation(input, {\n ...program.opts(),\n ...options,\n });\n\n if (result) {\n const logger = log.getLogger();\n logger.log('\\n');\n logger.log('Version: ', result.version);\n logger.log('Uploaded to: ', result.uploadS3Url);\n logger.log('URL: ', result.url);\n logger.log(\n 'Available Translations:',\n result.availableTranslationsUrl\n );\n }\n });\n\n program\n .command('upload-test-translations <input>')\n .description(\n `Uploads all the translations in the given input directory to the HelloAO Free Bible API test S3 bucket.\\nRequires access to the HelloAO Free Bible API test S3 bucket.\\nFor inquiries, please contact hello@helloao.org.`\n )\n .option(\n '--batch-size <size>',\n 'The number of translations to generate API files for in each batch.',\n '50'\n )\n .option(\n '--translations <translations...>',\n 'The translations to generate API files for.'\n )\n .option('--overwrite', 'Whether to overwrite existing files.')\n .option(\n '--overwrite-common-files',\n 'Whether to overwrite only common files.'\n )\n .option(\n '--file-pattern <pattern>',\n 'The file pattern regex that should be used to filter the files that are generated.'\n )\n .option(\n '--use-common-name',\n 'Whether to use the common name for the book chapter API link. If false, then book IDs are used.'\n )\n .option(\n '--generate-audio-files',\n 'Whether to replace the audio URLs in the dataset with ones that are hosted locally.'\n )\n .option(\n '--no-generate-complete-translation-files',\n 'Whether to skip generating complete translation files.'\n )\n .option(\n '--no-generate-simple-chapter-files',\n 'Whether to skip generating simplified chapter files.'\n )\n .option(\n '--profile <profile>',\n 'The AWS profile to use for uploading to S3.'\n )\n .option(\n '--access-key-id <accessKeyId>',\n 'The AWS access key ID to use for uploading to S3.'\n )\n .option(\n '--secret-access-key <secretAccessKey>',\n 'The AWS Secret Access Key to use for uploading to S3.'\n )\n .option(\n '--s3-region <region>',\n 'The AWS region to use for uploading to S3.'\n )\n .option('--pretty', 'Whether to generate pretty-printed JSON files.')\n .option(\n '--s3-url <s3Url>',\n 'The S3 bucket URL to upload the files to.',\n 's3://ao-bible-api-public-uploads'\n )\n .action(async (input: string, options: any) => {\n const good = await confirm({\n message:\n 'Uploaded files will be publicly accessible. Continue?',\n default: false,\n });\n\n if (!good) {\n return;\n }\n\n const result = await uploadTestTranslations(input, {\n ...program.opts(),\n ...options,\n });\n\n if (result) {\n const logger = log.getLogger();\n logger.log('\\nVersion: ', result.version);\n logger.log('Uploaded to: ', result.uploadS3Url);\n logger.log('URL: ', result.url);\n logger.log(\n 'Available Translations:',\n result.availableTranslationsUrl\n );\n }\n });\n\n program\n .command('generate-translation-files <input> <dir>')\n .description('Generates API files from the given input translation.')\n .option(\n '--batch-size <size>',\n 'The number of translations to generate API files for in each batch.',\n '50'\n )\n .option(\n '--translations <translations...>',\n 'The translations to generate API files for.'\n )\n .option('--overwrite', 'Whether to overwrite existing files.')\n .option(\n '--overwrite-common-files',\n 'Whether to overwrite only common files.'\n )\n .option(\n '--file-pattern <pattern>',\n 'The file pattern regex that should be used to filter the files that are generated.'\n )\n .option(\n '--use-common-name',\n 'Whether to use the common name for the book chapter API link. If false, then book IDs are used.'\n )\n .option(\n '--generate-audio-files',\n 'Whether to replace the audio URLs in the dataset with ones that are hosted locally.'\n )\n .option(\n '--profile <profile>',\n 'The AWS profile to use for uploading to S3.'\n )\n .option(\n '--access-key-id <accessKeyId>',\n 'The AWS access key ID to use for uploading to S3.'\n )\n .option(\n '--secret-access-key <secretAccessKey>',\n 'The AWS Secret Access Key to use for uploading to S3.'\n )\n .option(\n '--s3-region <region>',\n 'The AWS region to use for uploading to S3.'\n )\n .option('--pretty', 'Whether to generate pretty-printed JSON files.')\n .option(\n '--no-generate-complete-translation-files',\n 'Whether to skip generating complete translation files.'\n )\n .option(\n '--no-generate-simple-chapter-files',\n 'Whether to skip generating simplified chapter files.'\n )\n .action(async (input: string, dest: string, options: any) => {\n await generateTranslationFiles(input, dest, {\n ...program.opts(),\n ...options,\n });\n });\n\n program\n .command('generate-translations-files <input> <dir>')\n .description('Generates API files from the given input translations.')\n .option(\n '--batch-size <size>',\n 'The number of translations to generate API files for in each batch.',\n '50'\n )\n .option(\n '--translations <translations...>',\n 'The translations to generate API files for.'\n )\n .option('--overwrite', 'Whether to overwrite existing files.')\n .option(\n '--overwrite-common-files',\n 'Whether to overwrite only common files.'\n )\n .option(\n '--file-pattern <pattern>',\n 'The file pattern regex that should be used to filter the files that are uploaded.'\n )\n .option(\n '--use-common-name',\n 'Whether to use the common name for the book chapter API link. If false, then book IDs are used.'\n )\n .option(\n '--generate-audio-files',\n 'Whether to replace the audio URLs in the dataset with ones that are hosted locally.'\n )\n .option(\n '--no-generate-complete-translation-files',\n 'Whether to skip generating complete translation files.'\n )\n .option(\n '--no-generate-simple-chapter-files',\n 'Whether to skip generating simplified chapter files.'\n )\n .option(\n '--profile <profile>',\n 'The AWS profile to use for uploading to S3.'\n )\n .option(\n '--access-key-id <accessKeyId>',\n 'The AWS access key ID to use for uploading to S3.'\n )\n .option(\n '--secret-access-key <secretAccessKey>',\n 'The AWS Secret Access Key to use for uploading to S3.'\n )\n .option(\n '--s3-region <region>',\n 'The AWS region to use for uploading to S3.'\n )\n .option('--pretty', 'Whether to generate pretty-printed JSON files.')\n .action(async (input: string, dest: string, options: any) => {\n await generateTranslationsFiles(input, dest, {\n ...program.opts(),\n ...options,\n });\n });\n\n program\n .command('upload-api-files')\n .argument('<dest>', 'The destination to upload the API files to.')\n .description(\n 'Uploads API files to the specified destination. For S3, use the format s3://bucket-name/path/to/folder.'\n )\n .option(\n '--batch-size <size>',\n 'The number of translations to generate API files for in each batch.',\n '25'\n )\n .option(\n '--translations <translations...>',\n 'The translations or commentaries to generate API files for.'\n )\n .option('--overwrite', 'Whether to overwrite existing files.')\n .option(\n '--overwrite-common-files',\n 'Whether to overwrite only common files.'\n )\n .option(\n '--overwrite-merged-files',\n 'Whether to overwrite only merged files.'\n )\n .option(\n '--file-pattern <pattern>',\n 'The file pattern regex that should be used to filter the files that are uploaded.'\n )\n .option(\n '--use-common-name',\n 'Whether to use the common name for the book chapter API link. If false, then book IDs are used.'\n )\n .option(\n '--generate-audio-files',\n 'Whether to replace the audio URLs in the dataset with ones that are hosted locally.'\n )\n .option(\n '--no-generate-complete-translation-files',\n 'Whether to skip generating complete translation files.'\n )\n .option(\n '--no-generate-simple-chapter-files',\n 'Whether to skip generating simplified chapter files.'\n )\n .option(\n '--no-generate-open-api-document',\n 'Whether to skip generating the OpenAPI document file.'\n )\n .option(\n '--profile <profile>',\n 'The AWS profile to use for uploading to S3.'\n )\n .option(\n '--access-key-id <accessKeyId>',\n 'The AWS access key ID to use for uploading to S3.'\n )\n .option(\n '--secret-access-key <secretAccessKey>',\n 'The AWS Secret Access Key to use for uploading to S3.'\n )\n .option(\n '--s3-region <region>',\n 'The AWS region to use for uploading to S3.'\n )\n .option('--pretty', 'Whether to generate pretty-printed JSON files.')\n .option(\n '--verbose',\n 'Whether to output verbose information during the upload.'\n )\n .action(async (dest: string, options: any) => {\n const db = await getPrismaDb(program.opts().db);\n try {\n await uploadApiFilesFromDatabase(db, dest, {\n ...program.opts(),\n ...options,\n });\n } finally {\n db.$disconnect();\n }\n });\n program\n .command('upload-open-api-document')\n .argument(\n '<dest>',\n 'The destination to upload the OpenAPI document to.'\n )\n .description(\n 'Uploads the OpenAPI document to the specified destination. For S3, use the format s3://bucket-name/path/to/folder.'\n )\n .option(\n '--batch-size <size>',\n 'The number of translations to generate API files for in each batch.',\n '50'\n )\n .option(\n '--profile <profile>',\n 'The AWS profile to use for uploading to S3.'\n )\n .option(\n '--access-key-id <accessKeyId>',\n 'The AWS access key ID to use for uploading to S3.'\n )\n .option(\n '--secret-access-key <secretAccessKey>',\n 'The AWS Secret Access Key to use for uploading to S3.'\n )\n .option(\n '--s3-region <region>',\n 'The AWS region to use for uploading to S3.'\n )\n .option('--pretty', 'Whether to generate pretty-printed JSON files.')\n .option(\n '--verbose',\n 'Whether to output verbose information during the upload.'\n )\n .action(async (dest: string, options: any) => {\n await uploadOpenApiDocument(dest, {\n ...program.opts(),\n ...options,\n });\n });\n\n program\n .command('source-translations <dir> [translations...]')\n .description(\n 'Finds translation sources from ebible.org and downloads it.'\n )\n .option(\n '--convert-to-usx3',\n 'Convert USFM files to USX3 format after download'\n )\n .option(\n '--bible-multi-converter-path <path>',\n 'Path to BibleMultiConverter.jar file'\n )\n .option('--overwrite', 'Overwrite existing files in output directory')\n .option('--no-database', 'Disable database tracking for downloads')\n .action(async (dir, translations, options) => {\n const sourceOptions = {\n convertToUsx3: options.convertToUsx3,\n bibleMultiConverterPath: options.bibleMultiConverterPath,\n useDatabase: options.database !== false,\n overwrite: options.overwrite,\n conversionOptions: {\n overwrite: options.overwrite,\n },\n };\n\n await sourceTranslations(dir, translations, {\n ...program.opts(),\n ...sourceOptions,\n });\n });\n\n program\n .command('list-ebible-translations [search]')\n .description(\n 'List available eBible translations. Optionally filter by search term.'\n )\n .action(async (search?: string) => {\n await listEBibleTranslations(search);\n });\n\n program\n .command('fetch-audio <dir> [translations...]')\n .description(\n 'Fetches the specified audio translations and places them in the given directory.\\nTranslations should be in the format \"translationId/audioId\". e.g. \"BSB/gilbert\"'\n )\n .option(\n '-a, --all',\n 'Fetch all translations. If omitted, only undownloaded translations will be fetched.'\n )\n .action(async (dir: string, translations: string[], options: any) => {\n await fetchAudio(dir, translations, {\n ...program.opts(),\n ...options,\n });\n });\n\n program\n .command('fetch-bible-metadata <dir>')\n .description(\n 'Fetches the Theographic bible metadata and places it in the given directory.'\n )\n .action(async (dir: string) => {\n let files = [\n 'books.json',\n 'chapters.json',\n 'easton.json',\n 'events.json',\n 'people.json',\n 'peopleGroups.json',\n 'periods.json',\n 'places.json',\n 'verses.json',\n ];\n\n await mkdir(dir, { recursive: true });\n\n let promises = files.map(async (file) => {\n const url = `https://raw.githubusercontent.com/robertrouse/theographic-bible-metadata/master/json/${file}`;\n const fullPath = path.resolve(dir, file);\n await downloadFile(url, fullPath);\n });\n\n await Promise.all(promises);\n });\n\n program\n .command('fetch-tyndale-open-resources <dir>')\n .description(\n 'Fetches the Tyndale Open Bible Resources and places it in the given directory.'\n )\n .action(async (dir: string) => {\n let zipFiles = [\n 'TyndaleOpenBibleDictionary.zip',\n 'tyndale_open-studynotes.zip',\n ];\n\n await mkdir(dir, { recursive: true });\n\n let promises = zipFiles.map(async (file) => {\n const url = `https://tyndaleopenresources.com/wp-content/themes/tyndale-openresources/files/${file}`;\n const fullPath = path.resolve(dir, file);\n await downloadFile(url, fullPath);\n });\n\n await Promise.all(promises);\n });\n\n program\n .command('upload-typesense-verses <nodes...>')\n .description('Uploads bible chapter verses to a Typesense instance.')\n .option(\n '--api-key <apiKey>',\n 'The Typesense API key. If not specified, uses the TYPESENSE_API_KEY environment variable.'\n )\n .option('--language <language>', 'Filter by language code.')\n .option(\n '--translations <translations...>',\n 'The translations to upload. If not specified, all translations are uploaded.'\n )\n .action(async (nodes: string[], options: any) => {\n const apiKey = options.apiKey || process.env.TYPESENSE_API_KEY;\n\n if (!apiKey) {\n console.error(\n 'Error: No API key provided. Use --api-key or set the TYPESENSE_API_KEY environment variable.'\n );\n process.exit(1);\n }\n\n const db = await getPrismaDb(program.opts().db);\n try {\n await uploadTypesenseVerses(nodes, apiKey, db, {\n ...program.opts(),\n ...options,\n });\n } finally {\n db.$disconnect();\n }\n });\n\n program\n .command('typesense-search <node> <language> <query>')\n .description(\n 'Searches verses in the bible-verses Typesense collection.'\n )\n .option(\n '--api-key <apiKey>',\n 'The Typesense API key. If not specified, uses the TYPESENSE_API_KEY environment variable.'\n )\n .option('--translation <translation>', 'Filter by translation ID.')\n .option('--book <book>', 'Filter by book ID.')\n .option('--chapter <chapter>', 'Filter by chapter number.')\n .action(\n async (\n node: string,\n language: string,\n query: string,\n options: any\n ) => {\n const apiKey = options.apiKey || process.env.TYPESENSE_API_KEY;\n\n if (!apiKey) {\n console.error(\n 'Error: No API key provided. Use --api-key or set the TYPESENSE_API_KEY environment variable.'\n );\n process.exit(1);\n }\n\n const result = await searchTypesenseVerses([node], apiKey, {\n translation: options.translation,\n book: options.book,\n chapter: options.chapter,\n language,\n search: query,\n });\n\n const logger = log.getLogger();\n logger.log(JSON.stringify(result, null, 2));\n }\n );\n\n program\n .command('copy-openbible-audio <src> <dest>')\n .description(\n 'Copies .mp3 files from the OpenBible filename format to the Free Use Bible API format:\\n/api/{translationId}/{bookId}/{chapterNumber}/audio/{reader}.mp3'\n )\n .option(\n '--translation <translation>',\n 'The translation ID to copy (e.g. \"BSB\"). If omitted, all known translations are copied.'\n )\n .option(\n '--readers <readers...>',\n 'The readers to copy (e.g. \"hays souer\"). If omitted, all known readers for the translation are copied.'\n )\n .option('--overwrite', 'Whether to overwrite existing files.')\n .action(async (src: string, dest: string, options: any) => {\n await copyOpenBibleAudio(src, dest, {\n ...program.opts(),\n ...options,\n });\n });\n\n await program.parseAsync(process.argv);\n}\n\nstart();\n", "import { log } from '@helloao/tools';\r\nimport { BlobWriter, Entry, ZipReader } from '@zip.js/zip.js';\r\nimport fsExtra from 'fs-extra';\r\nconst { createWriteStream, exists } = fsExtra;\r\nimport path from 'node:path';\r\nimport { Readable } from 'node:stream';\r\nimport { finished } from 'node:stream/promises';\r\nimport { writeFile } from 'node:fs/promises';\r\n\r\nexport async function downloadFile(\r\n url: string,\r\n path: string,\r\n onProgress?: (progress: number) => void\r\n) {\r\n const logger = log.getLogger();\r\n logger.log('Downloading', url, 'to', path);\r\n const response = await fetch(url);\r\n await downloadResponse(response, path, onProgress);\r\n}\r\n\r\nexport async function downloadResponse(\r\n response: Response,\r\n path: string,\r\n onProgress?: (progress: number) => void\r\n) {\r\n const totalSize = Number(response.headers.get('content-length'));\r\n const reader = response.body!;\r\n const writeStream = createWriteStream(path);\r\n const readable = Readable.fromWeb(reader as any);\r\n if (onProgress) {\r\n let downloadedSize = 0;\r\n readable.on('data', (chunk) => {\r\n downloadedSize += chunk.length;\r\n onProgress(downloadedSize / totalSize);\r\n });\r\n }\r\n await finished(readable.pipe(writeStream));\r\n}\r\n\r\n/**\r\n * Unzips a ZipReader to a specified directory.\r\n * @param zip The ZipReader instance to read from.\r\n * @param directory The directory to unzip files into.\r\n * @param overwrite Wether to overwrite existing files.\r\n * @param entryFilter A filter function to determine which entries to unzip.\r\n * @param closeWhenDone Whether to close the ZipReader when done.\r\n * @returns The number of files that matched the entry filter.\r\n */\r\nexport async function unzipToDirectory(\r\n zip: ZipReader<unknown>,\r\n directory: string,\r\n overwrite: boolean,\r\n entryFilter: (entry: Entry) => boolean = () => true,\r\n closeWhenDone: boolean = true\r\n): Promise<number> {\r\n try {\r\n const logger = log.getLogger();\r\n const entries = await zip.getEntries();\r\n let usfmFileCount = 0;\r\n\r\n for (let entry of entries) {\r\n if (\r\n entry.getData &&\r\n entry.directory === false &&\r\n entryFilter(entry)\r\n ) {\r\n usfmFileCount++;\r\n const outputPath = path.resolve(directory, entry.filename);\r\n\r\n if (!overwrite && (await exists(outputPath))) {\r\n logger.log(\r\n `File already exists, skipping: ${entry.filename}`\r\n );\r\n continue;\r\n } else if (overwrite && (await exists(outputPath))) {\r\n logger.log(`Overwriting existing file: ${entry.filename}`);\r\n }\r\n\r\n const blob = await entry.getData(\r\n new BlobWriter('text/plain'),\r\n {}\r\n );\r\n await writeFile(\r\n outputPath,\r\n new Uint8Array(await blob.arrayBuffer())\r\n );\r\n }\r\n }\r\n\r\n return usfmFileCount;\r\n } finally {\r\n if (closeWhenDone) {\r\n await zip.close();\r\n }\r\n }\r\n}\r\n", "\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.\n * If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.\n *\n * \uD83D\uDFE2 You can import this file directly.\n */\n\nimport * as process from 'node:process'\nimport * as path from 'node:path'\nimport { fileURLToPath } from 'node:url'\nglobalThis['__dirname'] = path.dirname(fileURLToPath(import.meta.url))\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport * as $Enums from \"./enums\"\nimport * as $Class from \"./internal/class\"\nimport * as Prisma from \"./internal/prismaNamespace\"\n\nexport * as $Enums from './enums'\nexport * from \"./enums\"\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL })\n * })\n * // Fetch zero or more Translations\n * const translations = await prisma.translation.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\nexport const PrismaClient = $Class.getPrismaClientClass()\nexport type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions[\"omit\"] = Prisma.PrismaClientOptions[\"omit\"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>\nexport { Prisma }\n\n/**\n * Model Translation\n * \n */\nexport type Translation = Prisma.TranslationModel\n/**\n * Model Commentary\n * \n */\nexport type Commentary = Prisma.CommentaryModel\n/**\n * Model EBibleSource\n * \n */\nexport type EBibleSource = Prisma.EBibleSourceModel\n/**\n * Model InputFile\n * \n */\nexport type InputFile = Prisma.InputFileModel\n/**\n * Model InputFileWarning\n * \n */\nexport type InputFileWarning = Prisma.InputFileWarningModel\n/**\n * Model Book\n * \n */\nexport type Book = Prisma.BookModel\n/**\n * Model CommentaryBook\n * \n */\nexport type CommentaryBook = Prisma.CommentaryBookModel\n/**\n * Model CommentaryProfile\n * \n */\nexport type CommentaryProfile = Prisma.CommentaryProfileModel\n/**\n * Model Chapter\n * \n */\nexport type Chapter = Prisma.ChapterModel\n/**\n * Model CommentaryChapter\n * \n */\nexport type CommentaryChapter = Prisma.CommentaryChapterModel\n/**\n * Model ChapterAudioUrl\n * \n */\nexport type ChapterAudioUrl = Prisma.ChapterAudioUrlModel\n/**\n * Model ChapterAudioTiming\n * \n */\nexport type ChapterAudioTiming = Prisma.ChapterAudioTimingModel\n/**\n * Model ChapterWords\n * \n */\nexport type ChapterWords = Prisma.ChapterWordsModel\n/**\n * Model ChapterVerse\n * \n */\nexport type ChapterVerse = Prisma.ChapterVerseModel\n/**\n * Model CommentaryChapterVerse\n * \n */\nexport type CommentaryChapterVerse = Prisma.CommentaryChapterVerseModel\n/**\n * Model ChapterFootnote\n * \n */\nexport type ChapterFootnote = Prisma.ChapterFootnoteModel\n/**\n * Model Dataset\n * \n */\nexport type Dataset = Prisma.DatasetModel\n/**\n * Model DatasetBook\n * \n */\nexport type DatasetBook = Prisma.DatasetBookModel\n/**\n * Model DatasetChapter\n * \n */\nexport type DatasetChapter = Prisma.DatasetChapterModel\n/**\n * Model DatasetChapterVerse\n * \n */\nexport type DatasetChapterVerse = Prisma.DatasetChapterVerseModel\n/**\n * Model DatasetReference\n * \n */\nexport type DatasetReference = Prisma.DatasetReferenceModel\n", "\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * \uD83D\uDED1 Under no circumstances should you import this file directly! \uD83D\uDED1\n *\n * Please import the `PrismaClient` class from the `client.ts` file instead.\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"./prismaNamespace\"\n\n\nconst config: runtime.GetPrismaClientConfig = {\n \"previewFeatures\": [],\n \"clientVersion\": \"7.8.0\",\n \"engineVersion\": \"3c6e192761c0362d496ed980de936e2f3cebcd3a\",\n \"activeProvider\": \"sqlite\",\n \"inlineSchema\": \"datasource db {\\n provider = \\\"sqlite\\\"\\n}\\n\\ngenerator client {\\n provider = \\\"prisma-client\\\"\\n output = \\\"./prisma-gen\\\"\\n}\\n\\nmodel Translation {\\n id String @id\\n name String\\n website String\\n licenseUrl String\\n licenseNotes String?\\n licenseNotice String?\\n shortName String?\\n englishName String\\n language String\\n textDirection String\\n\\n // The SHA-256 hash of the translation\\n // includes everything about the translation, including the books, chapters, verses, footnotes, etc.\\n sha256 String?\\n\\n books Book[]\\n chapters Chapter[]\\n verses ChapterVerse[]\\n footnotes ChapterFootnote[]\\n audioUrls ChapterAudioUrl[]\\n audioTimings ChapterAudioTiming[]\\n words ChapterWords[]\\n}\\n\\nmodel Commentary {\\n id String @id\\n name String\\n website String\\n licenseUrl String\\n licenseNotes String?\\n licenseNotice String?\\n englishName String\\n language String\\n textDirection String\\n\\n // The SHA-256 hash of the translation\\n // includes everything about the translation, including the books, chapters, verses, footnotes, etc.\\n sha256 String?\\n\\n books CommentaryBook[]\\n chapters CommentaryChapter[]\\n verses CommentaryChapterVerse[]\\n profiles CommentaryProfile[]\\n}\\n\\n// The ebible.org source for a particular translation\\n// Contains metadata that is useful for managing downloads\\nmodel EBibleSource {\\n id String @id\\n\\n // The URL to the USFM zip file download\\n usfmZipUrl String?\\n // The ETag of the downloaded USFM zip file\\n usfmZipEtag String?\\n\\n languageCode String\\n title String\\n shortTitle String?\\n textDirection String?\\n redistributable Boolean\\n description String\\n copyright String\\n FCBHID String\\n updateDate DateTime\\n sourceDate DateTime\\n\\n oldTestamentBooks Int\\n oldTestamentChapters Int\\n oldTestamentVerses Int\\n newTestamentBooks Int\\n newTestamentChapters Int\\n newTestamentVerses Int\\n apocryphaBooks Int\\n apocryphaChapters Int\\n apocryphaVerses Int\\n\\n // The ID of the translation that the source is for\\n translationId String\\n\\n // The date that the source was downloaded\\n usfmDownloadDate DateTime?\\n\\n // The path that the USFM was downloaded to\\n usfmDownloadPath String?\\n\\n // The SHA-256 hash of the source\\n // Can be used to determine if the source has changed\\n sha256 String?\\n}\\n\\n// Files that were input into the API generator\\nmodel InputFile {\\n // The ID of the translation that the file is for\\n translationId String\\n\\n // The name of the file\\n name String\\n\\n format String\\n\\n // The SHA-256 hash of the file\\n sha256 String\\n\\n sizeInBytes Int\\n\\n @@id([translationId, name])\\n}\\n\\nmodel InputFileWarning {\\n // The name of the file\\n name String\\n\\n // The type of the warning\\n type String\\n\\n // The message of the warning\\n message String\\n\\n @@id([name, type, message])\\n}\\n\\nmodel Book {\\n id String\\n\\n translationId String\\n translation Translation @relation(fields: [translationId], references: [id])\\n\\n name String\\n commonName String\\n title String?\\n order Int\\n\\n numberOfChapters Int\\n\\n isApocryphal Boolean? // Whether the book is an apocryphal book\\n\\n // The SHA-256 hash of the book\\n sha256 String?\\n\\n chapters Chapter[]\\n verses ChapterVerse[]\\n footnotes ChapterFootnote[]\\n audioUrls ChapterAudioUrl[]\\n audioTimings ChapterAudioTiming[]\\n words ChapterWords[]\\n\\n @@id([translationId, id])\\n}\\n\\nmodel CommentaryBook {\\n id String\\n\\n commentaryId String\\n commentary Commentary @relation(fields: [commentaryId], references: [id])\\n\\n name String\\n commonName String\\n introduction String?\\n introductionSummary String?\\n order Int\\n\\n numberOfChapters Int\\n\\n // The SHA-256 hash of the book\\n sha256 String?\\n\\n chapters CommentaryChapter[]\\n verses CommentaryChapterVerse[]\\n\\n @@id([commentaryId, id])\\n}\\n\\nmodel CommentaryProfile {\\n id String\\n\\n commentaryId String\\n commentary Commentary @relation(fields: [commentaryId], references: [id])\\n\\n subject String\\n content String\\n\\n referenceBook String?\\n referenceChapter Int?\\n referenceVerse Int?\\n referenceEndChapter Int?\\n referenceEndVerse Int?\\n\\n json String // The JSON of the profile\\n\\n // The SHA-256 hash of the profile\\n sha256 String?\\n\\n @@id([commentaryId, id])\\n}\\n\\nmodel Chapter {\\n number Int\\n\\n bookId String\\n book Book @relation(fields: [translationId, bookId], references: [translationId, id])\\n\\n translationId String\\n translation Translation @relation(fields: [translationId], references: [id])\\n\\n json String // The JSON of the chapter\\n\\n // The SHA-256 hash of the chapter\\n sha256 String?\\n\\n verses ChapterVerse[]\\n footnotes ChapterFootnote[]\\n audioUrls ChapterAudioUrl[]\\n audioTimings ChapterAudioTiming[]\\n words ChapterWords[]\\n\\n @@id([translationId, bookId, number])\\n}\\n\\nmodel CommentaryChapter {\\n number Int\\n\\n bookId String\\n book CommentaryBook @relation(fields: [commentaryId, bookId], references: [commentaryId, id])\\n\\n commentaryId String\\n commentary Commentary @relation(fields: [commentaryId], references: [id])\\n\\n introduction String?\\n json String // The JSON of the chapter\\n\\n // The SHA-256 hash of the chapter\\n sha256 String?\\n\\n verses CommentaryChapterVerse[]\\n\\n @@id([commentaryId, bookId, number])\\n}\\n\\nmodel ChapterAudioUrl {\\n number Int\\n bookId String\\n book Book @relation(fields: [translationId, bookId], references: [translationId, id])\\n\\n translationId String\\n translation Translation @relation(fields: [translationId], references: [id])\\n\\n chapter Chapter @relation(fields: [translationId, bookId, number], references: [translationId, bookId, number])\\n\\n reader String\\n url String\\n\\n @@id([translationId, bookId, number, reader])\\n}\\n\\nmodel ChapterAudioTiming {\\n number Int\\n bookId String\\n book Book @relation(fields: [translationId, bookId], references: [translationId, id])\\n\\n translationId String\\n translation Translation @relation(fields: [translationId], references: [id])\\n\\n chapter Chapter @relation(fields: [translationId, bookId, number], references: [translationId, bookId, number])\\n\\n reader String\\n\\n // JSON array of numbers: the time (in seconds) that each verse starts, in verse order.\\n timingsJson String\\n\\n @@id([translationId, bookId, number, reader])\\n}\\n\\nmodel ChapterWords {\\n number Int\\n bookId String\\n book Book @relation(fields: [translationId, bookId], references: [translationId, id])\\n\\n translationId String\\n translation Translation @relation(fields: [translationId], references: [id])\\n\\n chapter Chapter @relation(fields: [translationId, bookId, number], references: [translationId, bookId, number])\\n\\n // JSON object that maps a verse number to the list of annotated words in the verse.\\n wordsJson String\\n\\n @@id([translationId, bookId, number])\\n}\\n\\nmodel ChapterVerse {\\n number Int\\n\\n chapterNumber Int\\n chapter Chapter @relation(fields: [translationId, bookId, chapterNumber], references: [translationId, bookId, number])\\n\\n bookId String\\n book Book @relation(fields: [translationId, bookId], references: [translationId, id])\\n\\n translationId String\\n translation Translation @relation(fields: [translationId], references: [id])\\n\\n text String // The text of the verse\\n contentJson String // The JSON of the verse content\\n\\n // The SHA-256 hash of the verse\\n sha256 String?\\n\\n footnotes ChapterFootnote[]\\n\\n @@id([translationId, bookId, chapterNumber, number])\\n}\\n\\nmodel CommentaryChapterVerse {\\n number Int\\n\\n chapterNumber Int\\n chapter CommentaryChapter @relation(fields: [commentaryId, bookId, chapterNumber], references: [commentaryId, bookId, number])\\n\\n bookId String\\n book CommentaryBook @relation(fields: [commentaryId, bookId], references: [commentaryId, id])\\n\\n commentaryId String\\n commentary Commentary @relation(fields: [commentaryId], references: [id])\\n\\n text String // The text of the verse\\n contentJson String // The JSON of the verse content\\n\\n // The SHA-256 hash of the verse\\n sha256 String?\\n\\n @@id([commentaryId, bookId, chapterNumber, number])\\n}\\n\\nmodel ChapterFootnote {\\n id Int\\n\\n chapterNumber Int\\n chapter Chapter @relation(fields: [translationId, bookId, chapterNumber], references: [translationId, bookId, number])\\n\\n bookId String\\n book Book @relation(fields: [translationId, bookId], references: [translationId, id])\\n\\n translationId String\\n translation Translation @relation(fields: [translationId], references: [id])\\n\\n text String\\n\\n // The SHA-256 hash of the footnote\\n sha256 String?\\n\\n verseNumber Int?\\n verse ChapterVerse? @relation(fields: [translationId, bookId, chapterNumber, verseNumber], references: [translationId, bookId, chapterNumber, number])\\n\\n @@id([translationId, bookId, chapterNumber, id])\\n}\\n\\nmodel Dataset {\\n id String @id\\n name String\\n website String\\n licenseUrl String\\n licenseNotes String?\\n englishName String\\n language String\\n textDirection String\\n\\n sha256 String?\\n\\n books DatasetBook[]\\n chapters DatasetChapter[]\\n verses DatasetChapterVerse[]\\n references DatasetReference[]\\n}\\n\\nmodel DatasetBook {\\n id String\\n\\n datasetId String\\n dataset Dataset @relation(fields: [datasetId], references: [id])\\n\\n order Int\\n\\n numberOfChapters Int\\n\\n // The SHA-256 hash of the book\\n sha256 String?\\n\\n chapters DatasetChapter[]\\n verses DatasetChapterVerse[]\\n references DatasetReference[]\\n\\n @@id([datasetId, id])\\n}\\n\\nmodel DatasetChapter {\\n number Int\\n\\n bookId String\\n book DatasetBook @relation(fields: [datasetId, bookId], references: [datasetId, id])\\n\\n datasetId String\\n dataset Dataset @relation(fields: [datasetId], references: [id])\\n\\n json String // The JSON of the chapter\\n\\n // The SHA-256 hash of the chapter\\n sha256 String?\\n\\n verses DatasetChapterVerse[]\\n references DatasetReference[]\\n\\n @@id([datasetId, bookId, number])\\n}\\n\\nmodel DatasetChapterVerse {\\n number Int\\n\\n chapterNumber Int\\n chapter DatasetChapter @relation(fields: [datasetId, bookId, chapterNumber], references: [datasetId, bookId, number])\\n\\n bookId String\\n book DatasetBook @relation(fields: [datasetId, bookId], references: [datasetId, id])\\n\\n datasetId String\\n dataset Dataset @relation(fields: [datasetId], references: [id])\\n\\n contentJson String // The JSON of the verse content\\n\\n // The SHA-256 hash of the verse\\n sha256 String?\\n\\n references DatasetReference[]\\n\\n @@id([datasetId, bookId, chapterNumber, number])\\n}\\n\\nmodel DatasetReference {\\n id Int @id @default(autoincrement())\\n\\n datasetId String\\n dataset Dataset @relation(fields: [datasetId], references: [id])\\n\\n bookId String\\n book DatasetBook @relation(fields: [datasetId, bookId], references: [datasetId, id])\\n\\n chapterNumber Int\\n chapter DatasetChapter @relation(fields: [datasetId, bookId, chapterNumber], references: [datasetId, bookId, number])\\n\\n verseNumber Int\\n verse DatasetChapterVerse @relation(fields: [datasetId, bookId, chapterNumber, verseNumber], references: [datasetId, bookId, chapterNumber, number])\\n\\n referenceBookId String\\n referenceChapter Int\\n referenceVerse Int\\n\\n endVerseNumber Int?\\n score Int?\\n}\\n\",\n \"runtimeDataModel\": {\n \"models\": {},\n \"enums\": {},\n \"types\": {}\n },\n \"parameterizationSchema\": {\n \"strings\": [],\n \"graph\": \"\"\n }\n}\n\nconfig.runtimeDataModel = JSON.parse(\"{\\\"models\\\":{\\\"Translation\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"website\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"licenseUrl\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"licenseNotes\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"licenseNotice\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"shortName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"englishName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"language\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"textDirection\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"books\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Book\\\",\\\"relationName\\\":\\\"BookToTranslation\\\"},{\\\"name\\\":\\\"chapters\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Chapter\\\",\\\"relationName\\\":\\\"ChapterToTranslation\\\"},{\\\"name\\\":\\\"verses\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterVerse\\\",\\\"relationName\\\":\\\"ChapterVerseToTranslation\\\"},{\\\"name\\\":\\\"footnotes\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterFootnote\\\",\\\"relationName\\\":\\\"ChapterFootnoteToTranslation\\\"},{\\\"name\\\":\\\"audioUrls\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterAudioUrl\\\",\\\"relationName\\\":\\\"ChapterAudioUrlToTranslation\\\"},{\\\"name\\\":\\\"audioTimings\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterAudioTiming\\\",\\\"relationName\\\":\\\"ChapterAudioTimingToTranslation\\\"},{\\\"name\\\":\\\"words\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterWords\\\",\\\"relationName\\\":\\\"ChapterWordsToTranslation\\\"}],\\\"dbName\\\":null},\\\"Commentary\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"website\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"licenseUrl\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"licenseNotes\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"licenseNotice\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"englishName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"language\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"textDirection\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"books\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"CommentaryBook\\\",\\\"relationName\\\":\\\"CommentaryToCommentaryBook\\\"},{\\\"name\\\":\\\"chapters\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"CommentaryChapter\\\",\\\"relationName\\\":\\\"CommentaryToCommentaryChapter\\\"},{\\\"name\\\":\\\"verses\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"CommentaryChapterVerse\\\",\\\"relationName\\\":\\\"CommentaryToCommentaryChapterVerse\\\"},{\\\"name\\\":\\\"profiles\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"CommentaryProfile\\\",\\\"relationName\\\":\\\"CommentaryToCommentaryProfile\\\"}],\\\"dbName\\\":null},\\\"EBibleSource\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"usfmZipUrl\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"usfmZipEtag\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"languageCode\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"title\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"shortTitle\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"textDirection\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"redistributable\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"description\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"copyright\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"FCBHID\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"updateDate\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"sourceDate\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"oldTestamentBooks\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"oldTestamentChapters\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"oldTestamentVerses\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"newTestamentBooks\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"newTestamentChapters\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"newTestamentVerses\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"apocryphaBooks\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"apocryphaChapters\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"apocryphaVerses\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"translationId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"usfmDownloadDate\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"DateTime\\\"},{\\\"name\\\":\\\"usfmDownloadPath\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"}],\\\"dbName\\\":null},\\\"InputFile\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"translationId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"format\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sizeInBytes\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"}],\\\"dbName\\\":null},\\\"InputFileWarning\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"type\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"message\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"}],\\\"dbName\\\":null},\\\"Book\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"translationId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"translation\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Translation\\\",\\\"relationName\\\":\\\"BookToTranslation\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"commonName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"title\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"order\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"numberOfChapters\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"isApocryphal\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Boolean\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"chapters\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Chapter\\\",\\\"relationName\\\":\\\"BookToChapter\\\"},{\\\"name\\\":\\\"verses\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterVerse\\\",\\\"relationName\\\":\\\"BookToChapterVerse\\\"},{\\\"name\\\":\\\"footnotes\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterFootnote\\\",\\\"relationName\\\":\\\"BookToChapterFootnote\\\"},{\\\"name\\\":\\\"audioUrls\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterAudioUrl\\\",\\\"relationName\\\":\\\"BookToChapterAudioUrl\\\"},{\\\"name\\\":\\\"audioTimings\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterAudioTiming\\\",\\\"relationName\\\":\\\"BookToChapterAudioTiming\\\"},{\\\"name\\\":\\\"words\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterWords\\\",\\\"relationName\\\":\\\"BookToChapterWords\\\"}],\\\"dbName\\\":null},\\\"CommentaryBook\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"commentaryId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"commentary\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Commentary\\\",\\\"relationName\\\":\\\"CommentaryToCommentaryBook\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"commonName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"introduction\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"introductionSummary\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"order\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"numberOfChapters\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"chapters\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"CommentaryChapter\\\",\\\"relationName\\\":\\\"CommentaryBookToCommentaryChapter\\\"},{\\\"name\\\":\\\"verses\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"CommentaryChapterVerse\\\",\\\"relationName\\\":\\\"CommentaryBookToCommentaryChapterVerse\\\"}],\\\"dbName\\\":null},\\\"CommentaryProfile\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"commentaryId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"commentary\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Commentary\\\",\\\"relationName\\\":\\\"CommentaryToCommentaryProfile\\\"},{\\\"name\\\":\\\"subject\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"content\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"referenceBook\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"referenceChapter\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"referenceVerse\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"referenceEndChapter\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"referenceEndVerse\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"json\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"}],\\\"dbName\\\":null},\\\"Chapter\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"number\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"bookId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"book\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Book\\\",\\\"relationName\\\":\\\"BookToChapter\\\"},{\\\"name\\\":\\\"translationId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"translation\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Translation\\\",\\\"relationName\\\":\\\"ChapterToTranslation\\\"},{\\\"name\\\":\\\"json\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"verses\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterVerse\\\",\\\"relationName\\\":\\\"ChapterToChapterVerse\\\"},{\\\"name\\\":\\\"footnotes\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterFootnote\\\",\\\"relationName\\\":\\\"ChapterToChapterFootnote\\\"},{\\\"name\\\":\\\"audioUrls\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterAudioUrl\\\",\\\"relationName\\\":\\\"ChapterToChapterAudioUrl\\\"},{\\\"name\\\":\\\"audioTimings\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterAudioTiming\\\",\\\"relationName\\\":\\\"ChapterToChapterAudioTiming\\\"},{\\\"name\\\":\\\"words\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterWords\\\",\\\"relationName\\\":\\\"ChapterToChapterWords\\\"}],\\\"dbName\\\":null},\\\"CommentaryChapter\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"number\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"bookId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"book\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"CommentaryBook\\\",\\\"relationName\\\":\\\"CommentaryBookToCommentaryChapter\\\"},{\\\"name\\\":\\\"commentaryId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"commentary\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Commentary\\\",\\\"relationName\\\":\\\"CommentaryToCommentaryChapter\\\"},{\\\"name\\\":\\\"introduction\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"json\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"verses\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"CommentaryChapterVerse\\\",\\\"relationName\\\":\\\"CommentaryChapterToCommentaryChapterVerse\\\"}],\\\"dbName\\\":null},\\\"ChapterAudioUrl\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"number\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"bookId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"book\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Book\\\",\\\"relationName\\\":\\\"BookToChapterAudioUrl\\\"},{\\\"name\\\":\\\"translationId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"translation\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Translation\\\",\\\"relationName\\\":\\\"ChapterAudioUrlToTranslation\\\"},{\\\"name\\\":\\\"chapter\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Chapter\\\",\\\"relationName\\\":\\\"ChapterToChapterAudioUrl\\\"},{\\\"name\\\":\\\"reader\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"url\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"}],\\\"dbName\\\":null},\\\"ChapterAudioTiming\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"number\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"bookId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"book\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Book\\\",\\\"relationName\\\":\\\"BookToChapterAudioTiming\\\"},{\\\"name\\\":\\\"translationId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"translation\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Translation\\\",\\\"relationName\\\":\\\"ChapterAudioTimingToTranslation\\\"},{\\\"name\\\":\\\"chapter\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Chapter\\\",\\\"relationName\\\":\\\"ChapterToChapterAudioTiming\\\"},{\\\"name\\\":\\\"reader\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"timingsJson\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"}],\\\"dbName\\\":null},\\\"ChapterWords\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"number\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"bookId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"book\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Book\\\",\\\"relationName\\\":\\\"BookToChapterWords\\\"},{\\\"name\\\":\\\"translationId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"translation\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Translation\\\",\\\"relationName\\\":\\\"ChapterWordsToTranslation\\\"},{\\\"name\\\":\\\"chapter\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Chapter\\\",\\\"relationName\\\":\\\"ChapterToChapterWords\\\"},{\\\"name\\\":\\\"wordsJson\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"}],\\\"dbName\\\":null},\\\"ChapterVerse\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"number\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"chapterNumber\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"chapter\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Chapter\\\",\\\"relationName\\\":\\\"ChapterToChapterVerse\\\"},{\\\"name\\\":\\\"bookId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"book\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Book\\\",\\\"relationName\\\":\\\"BookToChapterVerse\\\"},{\\\"name\\\":\\\"translationId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"translation\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Translation\\\",\\\"relationName\\\":\\\"ChapterVerseToTranslation\\\"},{\\\"name\\\":\\\"text\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"contentJson\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"footnotes\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterFootnote\\\",\\\"relationName\\\":\\\"ChapterFootnoteToChapterVerse\\\"}],\\\"dbName\\\":null},\\\"CommentaryChapterVerse\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"number\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"chapterNumber\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"chapter\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"CommentaryChapter\\\",\\\"relationName\\\":\\\"CommentaryChapterToCommentaryChapterVerse\\\"},{\\\"name\\\":\\\"bookId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"book\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"CommentaryBook\\\",\\\"relationName\\\":\\\"CommentaryBookToCommentaryChapterVerse\\\"},{\\\"name\\\":\\\"commentaryId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"commentary\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Commentary\\\",\\\"relationName\\\":\\\"CommentaryToCommentaryChapterVerse\\\"},{\\\"name\\\":\\\"text\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"contentJson\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"}],\\\"dbName\\\":null},\\\"ChapterFootnote\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"chapterNumber\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"chapter\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Chapter\\\",\\\"relationName\\\":\\\"ChapterToChapterFootnote\\\"},{\\\"name\\\":\\\"bookId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"book\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Book\\\",\\\"relationName\\\":\\\"BookToChapterFootnote\\\"},{\\\"name\\\":\\\"translationId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"translation\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Translation\\\",\\\"relationName\\\":\\\"ChapterFootnoteToTranslation\\\"},{\\\"name\\\":\\\"text\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"verseNumber\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"verse\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"ChapterVerse\\\",\\\"relationName\\\":\\\"ChapterFootnoteToChapterVerse\\\"}],\\\"dbName\\\":null},\\\"Dataset\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"name\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"website\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"licenseUrl\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"licenseNotes\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"englishName\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"language\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"textDirection\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"books\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetBook\\\",\\\"relationName\\\":\\\"DatasetToDatasetBook\\\"},{\\\"name\\\":\\\"chapters\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetChapter\\\",\\\"relationName\\\":\\\"DatasetToDatasetChapter\\\"},{\\\"name\\\":\\\"verses\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetChapterVerse\\\",\\\"relationName\\\":\\\"DatasetToDatasetChapterVerse\\\"},{\\\"name\\\":\\\"references\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetReference\\\",\\\"relationName\\\":\\\"DatasetToDatasetReference\\\"}],\\\"dbName\\\":null},\\\"DatasetBook\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"datasetId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"dataset\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Dataset\\\",\\\"relationName\\\":\\\"DatasetToDatasetBook\\\"},{\\\"name\\\":\\\"order\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"numberOfChapters\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"chapters\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetChapter\\\",\\\"relationName\\\":\\\"DatasetBookToDatasetChapter\\\"},{\\\"name\\\":\\\"verses\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetChapterVerse\\\",\\\"relationName\\\":\\\"DatasetBookToDatasetChapterVerse\\\"},{\\\"name\\\":\\\"references\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetReference\\\",\\\"relationName\\\":\\\"DatasetBookToDatasetReference\\\"}],\\\"dbName\\\":null},\\\"DatasetChapter\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"number\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"bookId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"book\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetBook\\\",\\\"relationName\\\":\\\"DatasetBookToDatasetChapter\\\"},{\\\"name\\\":\\\"datasetId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"dataset\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Dataset\\\",\\\"relationName\\\":\\\"DatasetToDatasetChapter\\\"},{\\\"name\\\":\\\"json\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"verses\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetChapterVerse\\\",\\\"relationName\\\":\\\"DatasetChapterToDatasetChapterVerse\\\"},{\\\"name\\\":\\\"references\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetReference\\\",\\\"relationName\\\":\\\"DatasetChapterToDatasetReference\\\"}],\\\"dbName\\\":null},\\\"DatasetChapterVerse\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"number\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"chapterNumber\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"chapter\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetChapter\\\",\\\"relationName\\\":\\\"DatasetChapterToDatasetChapterVerse\\\"},{\\\"name\\\":\\\"bookId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"book\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetBook\\\",\\\"relationName\\\":\\\"DatasetBookToDatasetChapterVerse\\\"},{\\\"name\\\":\\\"datasetId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"dataset\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Dataset\\\",\\\"relationName\\\":\\\"DatasetToDatasetChapterVerse\\\"},{\\\"name\\\":\\\"contentJson\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"sha256\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"references\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetReference\\\",\\\"relationName\\\":\\\"DatasetChapterVerseToDatasetReference\\\"}],\\\"dbName\\\":null},\\\"DatasetReference\\\":{\\\"fields\\\":[{\\\"name\\\":\\\"id\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"datasetId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"dataset\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"Dataset\\\",\\\"relationName\\\":\\\"DatasetToDatasetReference\\\"},{\\\"name\\\":\\\"bookId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"book\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetBook\\\",\\\"relationName\\\":\\\"DatasetBookToDatasetReference\\\"},{\\\"name\\\":\\\"chapterNumber\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"chapter\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetChapter\\\",\\\"relationName\\\":\\\"DatasetChapterToDatasetReference\\\"},{\\\"name\\\":\\\"verseNumber\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"verse\\\",\\\"kind\\\":\\\"object\\\",\\\"type\\\":\\\"DatasetChapterVerse\\\",\\\"relationName\\\":\\\"DatasetChapterVerseToDatasetReference\\\"},{\\\"name\\\":\\\"referenceBookId\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"String\\\"},{\\\"name\\\":\\\"referenceChapter\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"referenceVerse\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"endVerseNumber\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"},{\\\"name\\\":\\\"score\\\",\\\"kind\\\":\\\"scalar\\\",\\\"type\\\":\\\"Int\\\"}],\\\"dbName\\\":null}},\\\"enums\\\":{},\\\"types\\\":{}}\")\nconfig.parameterizationSchema = {\n strings: JSON.parse(\"[\\\"where\\\",\\\"orderBy\\\",\\\"cursor\\\",\\\"translation\\\",\\\"book\\\",\\\"chapter\\\",\\\"verse\\\",\\\"footnotes\\\",\\\"_count\\\",\\\"verses\\\",\\\"audioUrls\\\",\\\"audioTimings\\\",\\\"words\\\",\\\"chapters\\\",\\\"books\\\",\\\"Translation.findUnique\\\",\\\"Translation.findUniqueOrThrow\\\",\\\"Translation.findFirst\\\",\\\"Translation.findFirstOrThrow\\\",\\\"Translation.findMany\\\",\\\"data\\\",\\\"Translation.createOne\\\",\\\"Translation.createMany\\\",\\\"Translation.createManyAndReturn\\\",\\\"Translation.updateOne\\\",\\\"Translation.updateMany\\\",\\\"Translation.updateManyAndReturn\\\",\\\"create\\\",\\\"update\\\",\\\"Translation.upsertOne\\\",\\\"Translation.deleteOne\\\",\\\"Translation.deleteMany\\\",\\\"having\\\",\\\"_min\\\",\\\"_max\\\",\\\"Translation.groupBy\\\",\\\"Translation.aggregate\\\",\\\"commentary\\\",\\\"profiles\\\",\\\"Commentary.findUnique\\\",\\\"Commentary.findUniqueOrThrow\\\",\\\"Commentary.findFirst\\\",\\\"Commentary.findFirstOrThrow\\\",\\\"Commentary.findMany\\\",\\\"Commentary.createOne\\\",\\\"Commentary.createMany\\\",\\\"Commentary.createManyAndReturn\\\",\\\"Commentary.updateOne\\\",\\\"Commentary.updateMany\\\",\\\"Commentary.updateManyAndReturn\\\",\\\"Commentary.upsertOne\\\",\\\"Commentary.deleteOne\\\",\\\"Commentary.deleteMany\\\",\\\"Commentary.groupBy\\\",\\\"Commentary.aggregate\\\",\\\"EBibleSource.findUnique\\\",\\\"EBibleSource.findUniqueOrThrow\\\",\\\"EBibleSource.findFirst\\\",\\\"EBibleSource.findFirstOrThrow\\\",\\\"EBibleSource.findMany\\\",\\\"EBibleSource.createOne\\\",\\\"EBibleSource.createMany\\\",\\\"EBibleSource.createManyAndReturn\\\",\\\"EBibleSource.updateOne\\\",\\\"EBibleSource.updateMany\\\",\\\"EBibleSource.updateManyAndReturn\\\",\\\"EBibleSource.upsertOne\\\",\\\"EBibleSource.deleteOne\\\",\\\"EBibleSource.deleteMany\\\",\\\"_avg\\\",\\\"_sum\\\",\\\"EBibleSource.groupBy\\\",\\\"EBibleSource.aggregate\\\",\\\"InputFile.findUnique\\\",\\\"InputFile.findUniqueOrThrow\\\",\\\"InputFile.findFirst\\\",\\\"InputFile.findFirstOrThrow\\\",\\\"InputFile.findMany\\\",\\\"InputFile.createOne\\\",\\\"InputFile.createMany\\\",\\\"InputFile.createManyAndReturn\\\",\\\"InputFile.updateOne\\\",\\\"InputFile.updateMany\\\",\\\"InputFile.updateManyAndReturn\\\",\\\"InputFile.upsertOne\\\",\\\"InputFile.deleteOne\\\",\\\"InputFile.deleteMany\\\",\\\"InputFile.groupBy\\\",\\\"InputFile.aggregate\\\",\\\"InputFileWarning.findUnique\\\",\\\"InputFileWarning.findUniqueOrThrow\\\",\\\"InputFileWarning.findFirst\\\",\\\"InputFileWarning.findFirstOrThrow\\\",\\\"InputFileWarning.findMany\\\",\\\"InputFileWarning.createOne\\\",\\\"InputFileWarning.createMany\\\",\\\"InputFileWarning.createManyAndReturn\\\",\\\"InputFileWarning.updateOne\\\",\\\"InputFileWarning.updateMany\\\",\\\"InputFileWarning.updateManyAndReturn\\\",\\\"InputFileWarning.upsertOne\\\",\\\"InputFileWarning.deleteOne\\\",\\\"InputFileWarning.deleteMany\\\",\\\"InputFileWarning.groupBy\\\",\\\"InputFileWarning.aggregate\\\",\\\"Book.findUnique\\\",\\\"Book.findUniqueOrThrow\\\",\\\"Book.findFirst\\\",\\\"Book.findFirstOrThrow\\\",\\\"Book.findMany\\\",\\\"Book.createOne\\\",\\\"Book.createMany\\\",\\\"Book.createManyAndReturn\\\",\\\"Book.updateOne\\\",\\\"Book.updateMany\\\",\\\"Book.updateManyAndReturn\\\",\\\"Book.upsertOne\\\",\\\"Book.deleteOne\\\",\\\"Book.deleteMany\\\",\\\"Book.groupBy\\\",\\\"Book.aggregate\\\",\\\"CommentaryBook.findUnique\\\",\\\"CommentaryBook.findUniqueOrThrow\\\",\\\"CommentaryBook.findFirst\\\",\\\"CommentaryBook.findFirstOrThrow\\\",\\\"CommentaryBook.findMany\\\",\\\"CommentaryBook.createOne\\\",\\\"CommentaryBook.createMany\\\",\\\"CommentaryBook.createManyAndReturn\\\",\\\"CommentaryBook.updateOne\\\",\\\"CommentaryBook.updateMany\\\",\\\"CommentaryBook.updateManyAndReturn\\\",\\\"CommentaryBook.upsertOne\\\",\\\"CommentaryBook.deleteOne\\\",\\\"CommentaryBook.deleteMany\\\",\\\"CommentaryBook.groupBy\\\",\\\"CommentaryBook.aggregate\\\",\\\"CommentaryProfile.findUnique\\\",\\\"CommentaryProfile.findUniqueOrThrow\\\",\\\"CommentaryProfile.findFirst\\\",\\\"CommentaryProfile.findFirstOrThrow\\\",\\\"CommentaryProfile.findMany\\\",\\\"CommentaryProfile.createOne\\\",\\\"CommentaryProfile.createMany\\\",\\\"CommentaryProfile.createManyAndReturn\\\",\\\"CommentaryProfile.updateOne\\\",\\\"CommentaryProfile.updateMany\\\",\\\"CommentaryProfile.updateManyAndReturn\\\",\\\"CommentaryProfile.upsertOne\\\",\\\"CommentaryProfile.deleteOne\\\",\\\"CommentaryProfile.deleteMany\\\",\\\"CommentaryProfile.groupBy\\\",\\\"CommentaryProfile.aggregate\\\",\\\"Chapter.findUnique\\\",\\\"Chapter.findUniqueOrThrow\\\",\\\"Chapter.findFirst\\\",\\\"Chapter.findFirstOrThrow\\\",\\\"Chapter.findMany\\\",\\\"Chapter.createOne\\\",\\\"Chapter.createMany\\\",\\\"Chapter.createManyAndReturn\\\",\\\"Chapter.updateOne\\\",\\\"Chapter.updateMany\\\",\\\"Chapter.updateManyAndReturn\\\",\\\"Chapter.upsertOne\\\",\\\"Chapter.deleteOne\\\",\\\"Chapter.deleteMany\\\",\\\"Chapter.groupBy\\\",\\\"Chapter.aggregate\\\",\\\"CommentaryChapter.findUnique\\\",\\\"CommentaryChapter.findUniqueOrThrow\\\",\\\"CommentaryChapter.findFirst\\\",\\\"CommentaryChapter.findFirstOrThrow\\\",\\\"CommentaryChapter.findMany\\\",\\\"CommentaryChapter.createOne\\\",\\\"CommentaryChapter.createMany\\\",\\\"CommentaryChapter.createManyAndReturn\\\",\\\"CommentaryChapter.updateOne\\\",\\\"CommentaryChapter.updateMany\\\",\\\"CommentaryChapter.updateManyAndReturn\\\",\\\"CommentaryChapter.upsertOne\\\",\\\"CommentaryChapter.deleteOne\\\",\\\"CommentaryChapter.deleteMany\\\",\\\"CommentaryChapter.groupBy\\\",\\\"CommentaryChapter.aggregate\\\",\\\"ChapterAudioUrl.findUnique\\\",\\\"ChapterAudioUrl.findUniqueOrThrow\\\",\\\"ChapterAudioUrl.findFirst\\\",\\\"ChapterAudioUrl.findFirstOrThrow\\\",\\\"ChapterAudioUrl.findMany\\\",\\\"ChapterAudioUrl.createOne\\\",\\\"ChapterAudioUrl.createMany\\\",\\\"ChapterAudioUrl.createManyAndReturn\\\",\\\"ChapterAudioUrl.updateOne\\\",\\\"ChapterAudioUrl.updateMany\\\",\\\"ChapterAudioUrl.updateManyAndReturn\\\",\\\"ChapterAudioUrl.upsertOne\\\",\\\"ChapterAudioUrl.deleteOne\\\",\\\"ChapterAudioUrl.deleteMany\\\",\\\"ChapterAudioUrl.groupBy\\\",\\\"ChapterAudioUrl.aggregate\\\",\\\"ChapterAudioTiming.findUnique\\\",\\\"ChapterAudioTiming.findUniqueOrThrow\\\",\\\"ChapterAudioTiming.findFirst\\\",\\\"ChapterAudioTiming.findFirstOrThrow\\\",\\\"ChapterAudioTiming.findMany\\\",\\\"ChapterAudioTiming.createOne\\\",\\\"ChapterAudioTiming.createMany\\\",\\\"ChapterAudioTiming.createManyAndReturn\\\",\\\"ChapterAudioTiming.updateOne\\\",\\\"ChapterAudioTiming.updateMany\\\",\\\"ChapterAudioTiming.updateManyAndReturn\\\",\\\"ChapterAudioTiming.upsertOne\\\",\\\"ChapterAudioTiming.deleteOne\\\",\\\"ChapterAudioTiming.deleteMany\\\",\\\"ChapterAudioTiming.groupBy\\\",\\\"ChapterAudioTiming.aggregate\\\",\\\"ChapterWords.findUnique\\\",\\\"ChapterWords.findUniqueOrThrow\\\",\\\"ChapterWords.findFirst\\\",\\\"ChapterWords.findFirstOrThrow\\\",\\\"ChapterWords.findMany\\\",\\\"ChapterWords.createOne\\\",\\\"ChapterWords.createMany\\\",\\\"ChapterWords.createManyAndReturn\\\",\\\"ChapterWords.updateOne\\\",\\\"ChapterWords.updateMany\\\",\\\"ChapterWords.updateManyAndReturn\\\",\\\"ChapterWords.upsertOne\\\",\\\"ChapterWords.deleteOne\\\",\\\"ChapterWords.deleteMany\\\",\\\"ChapterWords.groupBy\\\",\\\"ChapterWords.aggregate\\\",\\\"ChapterVerse.findUnique\\\",\\\"ChapterVerse.findUniqueOrThrow\\\",\\\"ChapterVerse.findFirst\\\",\\\"ChapterVerse.findFirstOrThrow\\\",\\\"ChapterVerse.findMany\\\",\\\"ChapterVerse.createOne\\\",\\\"ChapterVerse.createMany\\\",\\\"ChapterVerse.createManyAndReturn\\\",\\\"ChapterVerse.updateOne\\\",\\\"ChapterVerse.updateMany\\\",\\\"ChapterVerse.updateManyAndReturn\\\",\\\"ChapterVerse.upsertOne\\\",\\\"ChapterVerse.deleteOne\\\",\\\"ChapterVerse.deleteMany\\\",\\\"ChapterVerse.groupBy\\\",\\\"ChapterVerse.aggregate\\\",\\\"CommentaryChapterVerse.findUnique\\\",\\\"CommentaryChapterVerse.findUniqueOrThrow\\\",\\\"CommentaryChapterVerse.findFirst\\\",\\\"CommentaryChapterVerse.findFirstOrThrow\\\",\\\"CommentaryChapterVerse.findMany\\\",\\\"CommentaryChapterVerse.createOne\\\",\\\"CommentaryChapterVerse.createMany\\\",\\\"CommentaryChapterVerse.createManyAndReturn\\\",\\\"CommentaryChapterVerse.updateOne\\\",\\\"CommentaryChapterVerse.updateMany\\\",\\\"CommentaryChapterVerse.updateManyAndReturn\\\",\\\"CommentaryChapterVerse.upsertOne\\\",\\\"CommentaryChapterVerse.deleteOne\\\",\\\"CommentaryChapterVerse.deleteMany\\\",\\\"CommentaryChapterVerse.groupBy\\\",\\\"CommentaryChapterVerse.aggregate\\\",\\\"ChapterFootnote.findUnique\\\",\\\"ChapterFootnote.findUniqueOrThrow\\\",\\\"ChapterFootnote.findFirst\\\",\\\"ChapterFootnote.findFirstOrThrow\\\",\\\"ChapterFootnote.findMany\\\",\\\"ChapterFootnote.createOne\\\",\\\"ChapterFootnote.createMany\\\",\\\"ChapterFootnote.createManyAndReturn\\\",\\\"ChapterFootnote.updateOne\\\",\\\"ChapterFootnote.updateMany\\\",\\\"ChapterFootnote.updateManyAndReturn\\\",\\\"ChapterFootnote.upsertOne\\\",\\\"ChapterFootnote.deleteOne\\\",\\\"ChapterFootnote.deleteMany\\\",\\\"ChapterFootnote.groupBy\\\",\\\"ChapterFootnote.aggregate\\\",\\\"dataset\\\",\\\"references\\\",\\\"Dataset.findUnique\\\",\\\"Dataset.findUniqueOrThrow\\\",\\\"Dataset.findFirst\\\",\\\"Dataset.findFirstOrThrow\\\",\\\"Dataset.findMany\\\",\\\"Dataset.createOne\\\",\\\"Dataset.createMany\\\",\\\"Dataset.createManyAndReturn\\\",\\\"Dataset.updateOne\\\",\\\"Dataset.updateMany\\\",\\\"Dataset.updateManyAndReturn\\\",\\\"Dataset.upsertOne\\\",\\\"Dataset.deleteOne\\\",\\\"Dataset.deleteMany\\\",\\\"Dataset.groupBy\\\",\\\"Dataset.aggregate\\\",\\\"DatasetBook.findUnique\\\",\\\"DatasetBook.findUniqueOrThrow\\\",\\\"DatasetBook.findFirst\\\",\\\"DatasetBook.findFirstOrThrow\\\",\\\"DatasetBook.findMany\\\",\\\"DatasetBook.createOne\\\",\\\"DatasetBook.createMany\\\",\\\"DatasetBook.createManyAndReturn\\\",\\\"DatasetBook.updateOne\\\",\\\"DatasetBook.updateMany\\\",\\\"DatasetBook.updateManyAndReturn\\\",\\\"DatasetBook.upsertOne\\\",\\\"DatasetBook.deleteOne\\\",\\\"DatasetBook.deleteMany\\\",\\\"DatasetBook.groupBy\\\",\\\"DatasetBook.aggregate\\\",\\\"DatasetChapter.findUnique\\\",\\\"DatasetChapter.findUniqueOrThrow\\\",\\\"DatasetChapter.findFirst\\\",\\\"DatasetChapter.findFirstOrThrow\\\",\\\"DatasetChapter.findMany\\\",\\\"DatasetChapter.createOne\\\",\\\"DatasetChapter.createMany\\\",\\\"DatasetChapter.createManyAndReturn\\\",\\\"DatasetChapter.updateOne\\\",\\\"DatasetChapter.updateMany\\\",\\\"DatasetChapter.updateManyAndReturn\\\",\\\"DatasetChapter.upsertOne\\\",\\\"DatasetChapter.deleteOne\\\",\\\"DatasetChapter.deleteMany\\\",\\\"DatasetChapter.groupBy\\\",\\\"DatasetChapter.aggregate\\\",\\\"DatasetChapterVerse.findUnique\\\",\\\"DatasetChapterVerse.findUniqueOrThrow\\\",\\\"DatasetChapterVerse.findFirst\\\",\\\"DatasetChapterVerse.findFirstOrThrow\\\",\\\"DatasetChapterVerse.findMany\\\",\\\"DatasetChapterVerse.createOne\\\",\\\"DatasetChapterVerse.createMany\\\",\\\"DatasetChapterVerse.createManyAndReturn\\\",\\\"DatasetChapterVerse.updateOne\\\",\\\"DatasetChapterVerse.updateMany\\\",\\\"DatasetChapterVerse.updateManyAndReturn\\\",\\\"DatasetChapterVerse.upsertOne\\\",\\\"DatasetChapterVerse.deleteOne\\\",\\\"DatasetChapterVerse.deleteMany\\\",\\\"DatasetChapterVerse.groupBy\\\",\\\"DatasetChapterVerse.aggregate\\\",\\\"DatasetReference.findUnique\\\",\\\"DatasetReference.findUniqueOrThrow\\\",\\\"DatasetReference.findFirst\\\",\\\"DatasetReference.findFirstOrThrow\\\",\\\"DatasetReference.findMany\\\",\\\"DatasetReference.createOne\\\",\\\"DatasetReference.createMany\\\",\\\"DatasetReference.createManyAndReturn\\\",\\\"DatasetReference.updateOne\\\",\\\"DatasetReference.updateMany\\\",\\\"DatasetReference.updateManyAndReturn\\\",\\\"DatasetReference.upsertOne\\\",\\\"DatasetReference.deleteOne\\\",\\\"DatasetReference.deleteMany\\\",\\\"DatasetReference.groupBy\\\",\\\"DatasetReference.aggregate\\\",\\\"AND\\\",\\\"OR\\\",\\\"NOT\\\",\\\"id\\\",\\\"datasetId\\\",\\\"bookId\\\",\\\"chapterNumber\\\",\\\"verseNumber\\\",\\\"referenceBookId\\\",\\\"referenceChapter\\\",\\\"referenceVerse\\\",\\\"endVerseNumber\\\",\\\"score\\\",\\\"equals\\\",\\\"in\\\",\\\"notIn\\\",\\\"lt\\\",\\\"lte\\\",\\\"gt\\\",\\\"gte\\\",\\\"not\\\",\\\"contains\\\",\\\"startsWith\\\",\\\"endsWith\\\",\\\"number\\\",\\\"contentJson\\\",\\\"sha256\\\",\\\"json\\\",\\\"order\\\",\\\"numberOfChapters\\\",\\\"name\\\",\\\"website\\\",\\\"licenseUrl\\\",\\\"licenseNotes\\\",\\\"englishName\\\",\\\"language\\\",\\\"textDirection\\\",\\\"every\\\",\\\"some\\\",\\\"none\\\",\\\"datasetId_bookId_chapterNumber_number\\\",\\\"datasetId_bookId_number\\\",\\\"datasetId_id\\\",\\\"translationId\\\",\\\"text\\\",\\\"commentaryId\\\",\\\"wordsJson\\\",\\\"reader\\\",\\\"timingsJson\\\",\\\"url\\\",\\\"introduction\\\",\\\"subject\\\",\\\"content\\\",\\\"referenceBook\\\",\\\"referenceEndChapter\\\",\\\"referenceEndVerse\\\",\\\"commonName\\\",\\\"introductionSummary\\\",\\\"title\\\",\\\"isApocryphal\\\",\\\"type\\\",\\\"message\\\",\\\"name_type_message\\\",\\\"format\\\",\\\"sizeInBytes\\\",\\\"translationId_name\\\",\\\"usfmZipUrl\\\",\\\"usfmZipEtag\\\",\\\"languageCode\\\",\\\"shortTitle\\\",\\\"redistributable\\\",\\\"description\\\",\\\"copyright\\\",\\\"FCBHID\\\",\\\"updateDate\\\",\\\"sourceDate\\\",\\\"oldTestamentBooks\\\",\\\"oldTestamentChapters\\\",\\\"oldTestamentVerses\\\",\\\"newTestamentBooks\\\",\\\"newTestamentChapters\\\",\\\"newTestamentVerses\\\",\\\"apocryphaBooks\\\",\\\"apocryphaChapters\\\",\\\"apocryphaVerses\\\",\\\"usfmDownloadDate\\\",\\\"usfmDownloadPath\\\",\\\"licenseNotice\\\",\\\"commentaryId_id\\\",\\\"commentaryId_bookId_chapterNumber_number\\\",\\\"commentaryId_bookId_number\\\",\\\"shortName\\\",\\\"translationId_bookId_number\\\",\\\"translationId_bookId_number_reader\\\",\\\"translationId_bookId_chapterNumber_id\\\",\\\"translationId_bookId_chapterNumber_number\\\",\\\"translationId_id\\\",\\\"is\\\",\\\"isNot\\\",\\\"connectOrCreate\\\",\\\"upsert\\\",\\\"createMany\\\",\\\"set\\\",\\\"disconnect\\\",\\\"delete\\\",\\\"connect\\\",\\\"updateMany\\\",\\\"deleteMany\\\",\\\"increment\\\",\\\"decrement\\\",\\\"multiply\\\",\\\"divide\\\"]\"),\n graph: \"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_QkAIAsAAP4JACAMAAD_CQAgDQAA-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_AwIA1gUAIcADQAC5CQAhwQMBAOUFACECAAAAjAEAIBQAAJgBACACAAAAjAEAIBQAAJgBACADAAAAiQEAIBsAAJEBACAcAACWAQAgAQAAAIkBACABAAAAjAEAIAwIAACyCQAgIQAAtQkAICIAALQJACBFAACzCQAgRgAAtgkAIIUDAADPBQAgjwMAAM8FACCtAwAAzwUAIK4DAADPBQAgsAMAAM8FACDAAwAAzwUAIMEDAADPBQAgHesCAACUBQAw7AIAAJ8BABDtAgAAlAUAMO4CAQDbBAAhhQMBAOYEACGPAwEA5gQAIZYDAQDbBAAhpQMBANsEACGtAwEA5gQAIa4DAQDmBAAhrwMBANsEACGwAwEA5gQAIbEDIACVBQAhsgMBANsEACGzAwEA2wQAIbQDAQDbBAAhtQNAAJYFACG2A0AAlgUAIbcDAgDaBAAhuAMCANoEACG5AwIA2gQAIboDAgDaBAAhuwMCANoEACG8AwIA2gQAIb0DAgDaBAAhvgMCANoEACG_AwIA2gQAIcADQACXBQAhwQMBAOYEACEDAAAAjAEAIAEAAJ4BADAgAACfAQAgAwAAAIwBACABAACNAQAwAgAAiQEAIAnrAgAAkgUAMOwCAAClAQAQ7QIAAJIFADCFAwEA7QQAIYkDAQDtBAAhlgMBAO0EACGqAwEA7QQAIasDAgD0BAAhrAMAAJMFACABAAAAogEAIAEAAACiAQAgCOsCAACSBQAw7AIAAKUBABDtAgAAkgUAMIUDAQDtBAAhiQMBAO0EACGWAwEA7QQAIaoDAQDtBAAhqwMCAPQEACEAAwAAAKUBACABAACmAQAwAgAAogEAIAMAAAClAQAgAQAApgEAMAIAAKIBACADAAAApQEAIAEAAKYBADACAACiAQAgBYUDAQAAAAGJAwEAAAABlgMBAAAAAaoDAQAAAAGrAwIAAAABARQAAKoBACAFhQMBAAAAAYkDAQAAAAGWAwEAAAABqgMBAAAAAasDAgAAAAEBFAAArAEAMAEUAACsAQAwBYUDAQDVBQAhiQMBANUFACGWAwEA1QUAIaoDAQDVBQAhqwMCANYFACECAAAAogEAIBQAAK8BACAFhQMBANUFACGJAwEA1QUAIZYDAQDVBQAhqgMBANUFACGrAwIA1gUAIQIAAAClAQAgFAAAsQEAIAIAAAClAQAgFAAAsQEAIAMAAACiAQAgGwAAqgEAIBwAAK8BACABAAAAogEAIAEAAAClAQAgBQgAAK0JACAhAACwCQAgIgAArwkAIEUAAK4JACBGAACxCQAgCOsCAACRBQAw7AIAALgBABDtAgAAkQUAMIUDAQDbBAAhiQMBANsEACGWAwEA2wQAIaoDAQDbBAAhqwMCANoEACEDAAAApQEAIAEAALcBADAgAAC4AQAgAwAAAKUBACABAACmAQAwAgAAogEAIAfrAgAAjwUAMOwCAAC-AQAQ7QIAAI8FADCJAwEA7QQAIacDAQDtBAAhqAMBAO0EACGpAwAAkAUAIAEAAAC7AQAgAQAAALsBACAG6wIAAI8FADDsAgAAvgEAEO0CAACPBQAwiQMBAO0EACGnAwEA7QQAIagDAQDtBAAhAAMAAAC-AQAgAQAAvwEAMAIAALsBACADAAAAvgEAIAEAAL8BADACAAC7AQAgAwAAAL4BACABAAC_AQAwAgAAuwEAIAOJAwEAAAABpwMBAAAAAagDAQAAAAEBFAAAwwEAIAOJAwEAAAABpwMBAAAAAagDAQAAAAEBFAAAxQEAMAEUAADFAQAwA4kDAQDVBQAhpwMBANUFACGoAwEA1QUAIQIAAAC7AQAgFAAAyAEAIAOJAwEA1QUAIacDAQDVBQAhqAMBANUFACECAAAAvgEAIBQAAMoBACACAAAAvgEAIBQAAMoBACADAAAAuwEAIBsAAMMBACAcAADIAQAgAQAAALsBACABAAAAvgEAIAMIAACqCQAgIQAArAkAICIAAKsJACAG6wIAAI4FADDsAgAA0QEAEO0CAACOBQAwiQMBANsEACGnAwEA2wQAIagDAQDbBAAhAwAAAL4BACABAADQAQAwIAAA0QEAIAMAAAC-AQAgAQAAvwEAMAIAALsBACABAAAABQAgAQAAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIBADAACjCQAgBwAApgkAIAkAAKUJACAKAACnCQAgCwAAqAkAIAwAAKkJACANAACkCQAg7gIBAAAAAYUDAQAAAAGHAwIAAAABiAMCAAAAAYkDAQAAAAGWAwEAAAABowMBAAAAAaUDAQAAAAGmAyAAAAABARQAANkBACAJ7gIBAAAAAYUDAQAAAAGHAwIAAAABiAMCAAAAAYkDAQAAAAGWAwEAAAABowMBAAAAAaUDAQAAAAGmAyAAAAABARQAANsBADABFAAA2wEAMBADAADjCAAgBwAA5ggAIAkAAOUIACAKAADnCAAgCwAA6AgAIAwAAOkIACANAADkCAAg7gIBANUFACGFAwEA5QUAIYcDAgDWBQAhiAMCANYFACGJAwEA1QUAIZYDAQDVBQAhowMBANUFACGlAwEA5QUAIaYDIADiCAAhAgAAAAUAIBQAAN4BACAJ7gIBANUFACGFAwEA5QUAIYcDAgDWBQAhiAMCANYFACGJAwEA1QUAIZYDAQDVBQAhowMBANUFACGlAwEA5QUAIaYDIADiCAAhAgAAAAMAIBQAAOABACACAAAAAwAgFAAA4AEAIAMAAAAFACAbAADZAQAgHAAA3gEAIAEAAAAFACABAAAAAwAgCAgAAN0IACAhAADgCAAgIgAA3wgAIEUAAN4IACBGAADhCAAghQMAAM8FACClAwAAzwUAIKYDAADPBQAgDOsCAACKBQAw7AIAAOcBABDtAgAAigUAMO4CAQDbBAAhhQMBAOYEACGHAwIA2gQAIYgDAgDaBAAhiQMBANsEACGWAwEA2wQAIaMDAQDbBAAhpQMBAOYEACGmAyAAiwUAIQMAAAADACABAADmAQAwIAAA5wEAIAMAAAADACABAAAEADACAAAFACABAAAAWgAgAQAAAFoAIAMAAABYACABAABZADACAABaACADAAAAWAAgAQAAWQAwAgAAWgAgAwAAAFgAIAEAAFkAMAIAAFoAIAwJAADcCAAgDQAA2wgAICUAANoIACDuAgEAAAABhQMBAAAAAYcDAgAAAAGIAwIAAAABiQMBAAAAAZgDAQAAAAGdAwEAAAABowMBAAAAAaQDAQAAAAEBFAAA7wEAIAnuAgEAAAABhQMBAAAAAYcDAgAAAAGIAwIAAAABiQMBAAAAAZgDAQAAAAGdAwEAAAABowMBAAAAAaQDAQAAAAEBFAAA8QEAMAEUAADxAQAwDAkAAMQIACANAADDCAAgJQAAwggAIO4CAQDVBQAhhQMBAOUFACGHAwIA1gUAIYgDAgDWBQAhiQMBANUFACGYAwEA1QUAIZ0DAQDlBQAhowMBANUFACGkAwEA5QUAIQIAAABaACAUAAD0AQAgCe4CAQDVBQAhhQMBAOUFACGHAwIA1gUAIYgDAgDWBQAhiQMBANUFACGYAwEA1QUAIZ0DAQDlBQAhowMBANUFACGkAwEA5QUAIQIAAABYACAUAAD2AQAgAgAAAFgAIBQAAPYBACADAAAAWgAgGwAA7wEAIBwAAPQBACABAAAAWgAgAQAAAFgAIAgIAAC9CAAgIQAAwAgAICIAAL8IACBFAAC-CAAgRgAAwQgAIIUDAADPBQAgnQMAAM8FACCkAwAAzwUAIAzrAgAAiQUAMOwCAAD9AQAQ7QIAAIkFADDuAgEA2wQAIYUDAQDmBAAhhwMCANoEACGIAwIA2gQAIYkDAQDbBAAhmAMBANsEACGdAwEA5gQAIaMDAQDbBAAhpAMBAOYEACEDAAAAWAAgAQAA_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_AgAQ7QIAAIYFADDwAgEA2wQAIYMDAgDaBAAhhQMBAOYEACGGAwEA2wQAIZgDAQDbBAAhnQMBAOYEACEDAAAAXAAgAQAAvgIAMCAAAL8CACADAAAAXAAgAQAAXQAwAgAAXgAgAQAAABgAIAEAAAAYACADAAAAFgAgAQAAFwAwAgAAGAAgAwAAABYAIAEAABcAMAIAABgAIAMAAAAWACABAAAXADACAAAYACAIAwAA0QcAIAQAANAHACAFAADSBwAg8AIBAAAAAYMDAgAAAAGWAwEAAAABmgMBAAAAAZwDAQAAAAEBFAAAxwIAIAXwAgEAAAABgwMCAAAAAZYDAQAAAAGaAwEAAAABnAMBAAAAAQEUAADJAgAwARQAAMkCADAIAwAAzgcAIAQAAM0HACAFAADPBwAg8AIBANUFACGDAwIA1gUAIZYDAQDVBQAhmgMBANUFACGcAwEA1QUAIQIAAAAYACAUAADMAgAgBfACAQDVBQAhgwMCANYFACGWAwEA1QUAIZoDAQDVBQAhnAMBANUFACECAAAAFgAgFAAAzgIAIAIAAAAWACAUAADOAgAgAwAAABgAIBsAAMcCACAcAADMAgAgAQAAABgAIAEAAAAWACAFCAAAyAcAICEAAMsHACAiAADKBwAgRQAAyQcAIEYAAMwHACAI6wIAAIUFADDsAgAA1QIAEO0CAACFBQAw8AIBANsEACGDAwIA2gQAIZYDAQDbBAAhmgMBANsEACGcAwEA2wQAIQMAAAAWACABAADUAgAwIAAA1QIAIAMAAAAWACABAAAXADACAAAYACABAAAAHAAgAQAAABwAIAMAAAAaACABAAAbADACAAAcACADAAAAGgAgAQAAGwAwAgAAHAAgAwAAABoAIAEAABsAMAIAABwAIAgDAADGBwAgBAAAxQcAIAUAAMcHACDwAgEAAAABgwMCAAAAAZYDAQAAAAGaAwEAAAABmwMBAAAAAQEUAADdAgAgBfACAQAAAAGDAwIAAAABlgMBAAAAAZoDAQAAAAGbAwEAAAABARQAAN8CADABFAAA3wIAMAgDAADDBwAgBAAAwgcAIAUAAMQHACDwAgEA1QUAIYMDAgDWBQAhlgMBANUFACGaAwEA1QUAIZsDAQDVBQAhAgAAABwAIBQAAOICACAF8AIBANUFACGDAwIA1gUAIZYDAQDVBQAhmgMBANUFACGbAwEA1QUAIQIAAAAaACAUAADkAgAgAgAAABoAIBQAAOQCACADAAAAHAAgGwAA3QIAIBwAAOICACABAAAAHAAgAQAAABoAIAUIAAC9BwAgIQAAwAcAICIAAL8HACBFAAC-BwAgRgAAwQcAIAjrAgAAhAUAMOwCAADrAgAQ7QIAAIQFADDwAgEA2wQAIYMDAgDaBAAhlgMBANsEACGaAwEA2wQAIZsDAQDbBAAhAwAAABoAIAEAAOoCADAgAADrAgAgAwAAABoAIAEAABsAMAIAABwAIAEAAAAgACABAAAAIAAgAwAAAB4AIAEAAB8AMAIAACAAIAMAAAAeACABAAAfADACAAAgACADAAAAHgAgAQAAHwAwAgAAIAAgBwMAALsHACAEAAC6BwAgBQAAvAcAIPACAQAAAAGDAwIAAAABlgMBAAAAAZkDAQAAAAEBFAAA8wIAIATwAgEAAAABgwMCAAAAAZYDAQAAAAGZAwEAAAABARQAAPUCADABFAAA9QIAMAcDAAC4BwAgBAAAtwcAIAUAALkHACDwAgEA1QUAIYMDAgDWBQAhlgMBANUFACGZAwEA1QUAIQIAAAAgACAUAAD4AgAgBPACAQDVBQAhgwMCANYFACGWAwEA1QUAIZkDAQDVBQAhAgAAAB4AIBQAAPoCACACAAAAHgAgFAAA-gIAIAMAAAAgACAbAADzAgAgHAAA-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_wQAMOwCAADKAwAQ7QIAAP8EADDuAgEA7QQAIe8CAQDtBAAhhQMBAO4EACGHAwIA9AQAIYgDAgD0BAAhBQkAAPsGACANAAD6BgAgmQIAAP0GACCaAgAA_AYAIIUDAADPBQAgDQkAAPEEACANAADwBAAgmQIAAPYEACCaAgAA8gQAIOsCAAD_BAAw7AIAAMoDABDtAgAA_wQAMO4CAQDtBAAh7wIBAO0EACGFAwEA7gQAIYcDAgD0BAAhiAMCAPQEACGVAwAA_gQAIAMAAADKAwAgAQAAywMAMAIAAMwDACAMBAAA9wQAIAkAAPEEACCZAgAA9gQAIJoCAADyBAAg6wIAAP0EADDsAgAAzgMAEO0CAAD9BAAw7wIBAO0EACHwAgEA7QQAIYMDAgD0BAAhhQMBAO4EACGGAwEA7QQAIQUEAAD-BgAgCQAA-wYAIJkCAAD9BgAgmgIAAPwGACCFAwAAzwUAIA0EAAD3BAAgCQAA8QQAIJkCAAD2BAAgmgIAAPIEACDrAgAA_QQAMOwCAADOAwAQ7QIAAP0EADDvAgEA7QQAIfACAQDtBAAhgwMCAPQEACGFAwEA7gQAIYYDAQDtBAAhlAMAAPwEACADAAAAzgMAIAEAAM8DADACAADQAwAgDQQAAPcEACAFAAD4BAAgmQIAAPYEACCaAgAA8gQAIOsCAAD7BAAw7AIAANIDABDtAgAA-wQAMO8CAQDtBAAh8AIBAO0EACHxAgIA9AQAIYMDAgD0BAAhhAMBAO0EACGFAwEA7gQAIQUEAAD-BgAgBQAA_wYAIJkCAAD9BgAgmgIAAPwGACCFAwAAzwUAIA4EAAD3BAAgBQAA-AQAIJkCAAD2BAAgmgIAAPIEACDrAgAA-wQAMOwCAADSAwAQ7QIAAPsEADDvAgEA7QQAIfACAQDtBAAh8QICAPQEACGDAwIA9AQAIYQDAQDtBAAhhQMBAO4EACGTAwAA-gQAIAMAAADSAwAgAQAA0wMAMAIAANQDACARBAAA9wQAIAUAAPgEACAGAAD5BAAgmQIAAPYEACDrAgAA8wQAMOwCAADWAwAQ7QIAAPMEADDuAgIA9AQAIe8CAQDtBAAh8AIBAO0EACHxAgIA9AQAIfICAgD0BAAh8wIBAO0EACH0AgIA9AQAIfUCAgD0BAAh9gICAPUEACH3AgIA9QQAIQYEAAD-BgAgBQAA_wYAIAYAAIAHACCZAgAA_QYAIPYCAADPBQAg9wIAAM8FACARBAAA9wQAIAUAAPgEACAGAAD5BAAgmQIAAPYEACDrAgAA8wQAMOwCAADWAwAQ7QIAAPMEADDuAgIAAAAB7wIBAO0EACHwAgEA7QQAIfECAgD0BAAh8gICAPQEACHzAgEA7QQAIfQCAgD0BAAh9QICAPQEACH2AgIA9QQAIfcCAgD1BAAhAwAAANYDACABAADXAwAwAgAA2AMAIAEAAADWAwAgAwAAANYDACABAADXAwAwAgAA2AMAIAEAAADSAwAgAQAAANYDACADAAAA0gMAIAEAANMDADACAADUAwAgAwAAANYDACABAADXAwAwAgAA2AMAIAEAAADOAwAgAQAAANIDACABAAAA1gMAIAMAAADOAwAgAQAAzwMAMAIAANADACADAAAA0gMAIAEAANMDADACAADUAwAgAwAAANYDACABAADXAwAwAgAA2AMAIAEAAADKAwAgAQAAAM4DACABAAAA0gMAIAEAAADWAwAgAQAAAMgDACAQCQAA8QQAIA0AAPAEACAOAADvBAAgmgIAAPIEACDrAgAA7AQAMOwCAADrAwAQ7QIAAOwEADDuAgEA7QQAIYUDAQDuBAAhiQMBAO0EACGKAwEA7QQAIYsDAQDtBAAhjAMBAO4EACGNAwEA7QQAIY4DAQDtBAAhjwMBAO0EACEGCQAA-wYAIA0AAPoGACAOAAD5BgAgmgIAAPwGACCFAwAAzwUAIIwDAADPBQAgAwAAAOsDACABAADsAwAwAgAAyAMAIAMAAADrAwAgAQAA7AMAMAIAAMgDACADAAAA6wMAIAEAAOwDADACAADIAwAgDQkAAPcGACANAAD2BgAgDgAA9QYAIJoCAAD4BgAg7gIBAAAAAYUDAQAAAAGJAwEAAAABigMBAAAAAYsDAQAAAAGMAwEAAAABjQMBAAAAAY4DAQAAAAGPAwEAAAABARQAAPADACAJ7gIBAAAAAYUDAQAAAAGJAwEAAAABigMBAAAAAYsDAQAAAAGMAwEAAAABjQMBAAAAAY4DAQAAAAGPAwEAAAABARQAAPIDADABFAAA8gMAMA0JAADMBgAgDQAAywYAIA4AAMoGACCaAgAAzQYAIO4CAQDVBQAhhQMBAOUFACGJAwEA1QUAIYoDAQDVBQAhiwMBANUFACGMAwEA5QUAIY0DAQDVBQAhjgMBANUFACGPAwEA1QUAIQIAAADIAwAgFAAA9QMAIAnuAgEA1QUAIYUDAQDlBQAhiQMBANUFACGKAwEA1QUAIYsDAQDVBQAhjAMBAOUFACGNAwEA1QUAIY4DAQDVBQAhjwMBANUFACECAAAA6wMAIBQAAPcDACACAAAA6wMAIBQAAPcDACADAAAAyAMAIBsAAPADACAcAAD1AwAgAQAAAMgDACABAAAA6wMAIAUIAADHBgAgIQAAyQYAICIAAMgGACCFAwAAzwUAIIwDAADPBQAgDOsCAADrBAAw7AIAAP4DABDtAgAA6wQAMO4CAQDbBAAhhQMBAOYEACGJAwEA2wQAIYoDAQDbBAAhiwMBANsEACGMAwEA5gQAIY0DAQDbBAAhjgMBANsEACGPAwEA2wQAIQMAAADrAwAgAQAA_QMAMCAAAP4DACADAAAA6wMAIAEAAOwDADACAADIAwAgAQAAAMwDACABAAAAzAMAIAMAAADKAwAgAQAAywMAMAIAAMwDACADAAAAygMAIAEAAMsDADACAADMAwAgAwAAAMoDACABAADLAwAwAgAAzAMAIAkJAADFBgAgDQAAxAYAIJkCAADDBgAgmgIAAMYGACDuAgEAAAAB7wIBAAAAAYUDAQAAAAGHAwIAAAABiAMCAAAAAQEUAACGBAAgBe4CAQAAAAHvAgEAAAABhQMBAAAAAYcDAgAAAAGIAwIAAAABARQAAIgEADABFAAAiAQAMAkJAACjBgAgDQAAogYAIJkCAAChBgAgmgIAAKQGACDuAgEA1QUAIe8CAQDVBQAhhQMBAOUFACGHAwIA1gUAIYgDAgDWBQAhAgAAAMwDACAUAACLBAAgBe4CAQDVBQAh7wIBANUFACGFAwEA5QUAIYcDAgDWBQAhiAMCANYFACECAAAAygMAIBQAAI0EACACAAAAygMAIBQAAI0EACADAAAAzAMAIBsAAIYEACAcAACLBAAgAQAAAMwDACABAAAAygMAIAYIAACcBgAgIQAAnwYAICIAAJ4GACBFAACdBgAgRgAAoAYAIIUDAADPBQAgCOsCAADqBAAw7AIAAJQEABDtAgAA6gQAMO4CAQDbBAAh7wIBANsEACGFAwEA5gQAIYcDAgDaBAAhiAMCANoEACEDAAAAygMAIAEAAJMEADAgAACUBAAgAwAAAMoDACABAADLAwAwAgAAzAMAIAEAAADQAwAgAQAAANADACADAAAAzgMAIAEAAM8DADACAADQAwAgAwAAAM4DACABAADPAwAwAgAA0AMAIAMAAADOAwAgAQAAzwMAMAIAANADACAJBAAAmAYAIAkAAJoGACCZAgAAmQYAIJoCAACbBgAg7wIBAAAAAfACAQAAAAGDAwIAAAABhQMBAAAAAYYDAQAAAAEBFAAAnAQAIAXvAgEAAAAB8AIBAAAAAYMDAgAAAAGFAwEAAAABhgMBAAAAAQEUAACeBAAwARQAAJ4EADAJBAAA_wUAIAkAAIEGACCZAgAAgAYAIJoCAACCBgAg7wIBANUFACHwAgEA1QUAIYMDAgDWBQAhhQMBAOUFACGGAwEA1QUAIQIAAADQAwAgFAAAoQQAIAXvAgEA1QUAIfACAQDVBQAhgwMCANYFACGFAwEA5QUAIYYDAQDVBQAhAgAAAM4DACAUAACjBAAgAgAAAM4DACAUAACjBAAgAwAAANADACAbAACcBAAgHAAAoQQAIAEAAADQAwAgAQAAAM4DACAGCAAA-gUAICEAAP0FACAiAAD8BQAgRQAA-wUAIEYAAP4FACCFAwAAzwUAIAjrAgAA6QQAMOwCAACqBAAQ7QIAAOkEADDvAgEA2wQAIfACAQDbBAAhgwMCANoEACGFAwEA5gQAIYYDAQDbBAAhAwAAAM4DACABAACpBAAwIAAAqgQAIAMAAADOAwAgAQAAzwMAMAIAANADACABAAAA1AMAIAEAAADUAwAgAwAAANIDACABAADTAwAwAgAA1AMAIAMAAADSAwAgAQAA0wMAMAIAANQDACADAAAA0gMAIAEAANMDADACAADUAwAgCgQAAPcFACAFAAD2BQAgmQIAAPgFACCaAgAA-QUAIO8CAQAAAAHwAgEAAAAB8QICAAAAAYMDAgAAAAGEAwEAAAABhQMBAAAAAQEUAACyBAAgBu8CAQAAAAHwAgEAAAAB8QICAAAAAYMDAgAAAAGEAwEAAAABhQMBAAAAAQEUAAC0BAAwARQAALQEADAKBAAA5wUAIAUAAOYFACCZAgAA6AUAIJoCAADpBQAg7wIBANUFACHwAgEA1QUAIfECAgDWBQAhgwMCANYFACGEAwEA1QUAIYUDAQDlBQAhAgAAANQDACAUAAC3BAAgBu8CAQDVBQAh8AIBANUFACHxAgIA1gUAIYMDAgDWBQAhhAMBANUFACGFAwEA5QUAIQIAAADSAwAgFAAAuQQAIAIAAADSAwAgFAAAuQQAIAMAAADUAwAgGwAAsgQAIBwAALcEACABAAAA1AMAIAEAAADSAwAgBggAAOAFACAhAADjBQAgIgAA4gUAIEUAAOEFACBGAADkBQAghQMAAM8FACAJ6wIAAOUEADDsAgAAwAQAEO0CAADlBAAw7wIBANsEACHwAgEA2wQAIfECAgDaBAAhgwMCANoEACGEAwEA2wQAIYUDAQDmBAAhAwAAANIDACABAAC_BAAwIAAAwAQAIAMAAADSAwAgAQAA0wMAMAIAANQDACABAAAA2AMAIAEAAADYAwAgAwAAANYDACABAADXAwAwAgAA2AMAIAMAAADWAwAgAQAA1wMAMAIAANgDACADAAAA1gMAIAEAANcDADACAADYAwAgDgQAAN0FACAFAADeBQAgBgAA3wUAIJkCAADcBQAg7gICAAAAAe8CAQAAAAHwAgEAAAAB8QICAAAAAfICAgAAAAHzAgEAAAAB9AICAAAAAfUCAgAAAAH2AgIAAAAB9wICAAAAAQEUAADIBAAgCu4CAgAAAAHvAgEAAAAB8AIBAAAAAfECAgAAAAHyAgIAAAAB8wIBAAAAAfQCAgAAAAH1AgIAAAAB9gICAAAAAfcCAgAAAAEBFAAAygQAMAEUAADKBAAwDgQAANkFACAFAADaBQAgBgAA2wUAIJkCAADYBQAg7gICANYFACHvAgEA1QUAIfACAQDVBQAh8QICANYFACHyAgIA1gUAIfMCAQDVBQAh9AICANYFACH1AgIA1gUAIfYCAgDXBQAh9wICANcFACECAAAA2AMAIBQAAM0EACAK7gICANYFACHvAgEA1QUAIfACAQDVBQAh8QICANYFACHyAgIA1gUAIfMCAQDVBQAh9AICANYFACH1AgIA1gUAIfYCAgDXBQAh9wICANcFACECAAAA1gMAIBQAAM8EACACAAAA1gMAIBQAAM8EACADAAAA2AMAIBsAAMgEACAcAADNBAAgAQAAANgDACABAAAA1gMAIAcIAADQBQAgIQAA0wUAICIAANIFACBFAADRBQAgRgAA1AUAIPYCAADPBQAg9wIAAM8FACAN6wIAANkEADDsAgAA1gQAEO0CAADZBAAw7gICANoEACHvAgEA2wQAIfACAQDbBAAh8QICANoEACHyAgIA2gQAIfMCAQDbBAAh9AICANoEACH1AgIA2gQAIfYCAgDcBAAh9wICANwEACEDAAAA1gMAIAEAANUEADAgAADWBAAgAwAAANYDACABAADXAwAwAgAA2AMAIA3rAgAA2QQAMOwCAADWBAAQ7QIAANkEADDuAgIA2gQAIe8CAQDbBAAh8AIBANsEACHxAgIA2gQAIfICAgDaBAAh8wIBANsEACH0AgIA2gQAIfUCAgDaBAAh9gICANwEACH3AgIA3AQAIQ0IAADhBAAgIQAA4QQAICIAAOEEACBFAADkBAAgRgAA4QQAIPgCAgAAAAH5AgIAAAAE-gICAAAABPsCAgAAAAH8AgIAAAAB_QICAAAAAf4CAgAAAAH_AgIA4wQAIQ4IAADhBAAgIQAA4gQAICIAAOIEACD4AgEAAAAB-QIBAAAABPoCAQAAAAT7AgEAAAAB_AIBAAAAAf0CAQAAAAH-AgEAAAAB_wIBAOAEACGAAwEAAAABgQMBAAAAAYIDAQAAAAENCAAA3gQAICEAAN4EACAiAADeBAAgRQAA3wQAIEYAAN4EACD4AgIAAAAB-QICAAAABfoCAgAAAAX7AgIAAAAB_AICAAAAAf0CAgAAAAH-AgIAAAAB_wICAN0EACENCAAA3gQAICEAAN4EACAiAADeBAAgRQAA3wQAIEYAAN4EACD4AgIAAAAB-QICAAAABfoCAgAAAAX7AgIAAAAB_AICAAAAAf0CAgAAAAH-AgIAAAAB_wICAN0EACEI-AICAAAAAfkCAgAAAAX6AgIAAAAF-wICAAAAAfwCAgAAAAH9AgIAAAAB_gICAAAAAf8CAgDeBAAhCPgCCAAAAAH5AggAAAAF-gIIAAAABfsCCAAAAAH8AggAAAAB_QIIAAAAAf4CCAAAAAH_AggA3wQAIQ4IAADhBAAgIQAA4gQAICIAAOIEACD4AgEAAAAB-QIBAAAABPoCAQAAAAT7AgEAAAAB_AIBAAAAAf0CAQAAAAH-AgEAAAAB_wIBAOAEACGAAwEAAAABgQMBAAAAAYIDAQAAAAEI-AICAAAAAfkCAgAAAAT6AgIAAAAE-wICAAAAAfwCAgAAAAH9AgIAAAAB_gICAAAAAf8CAgDhBAAhC_gCAQAAAAH5AgEAAAAE-gIBAAAABPsCAQAAAAH8AgEAAAAB_QIBAAAAAf4CAQAAAAH_AgEA4gQAIYADAQAAAAGBAwEAAAABggMBAAAAAQ0IAADhBAAgIQAA4QQAICIAAOEEACBFAADkBAAgRgAA4QQAIPgCAgAAAAH5AgIAAAAE-gICAAAABPsCAgAAAAH8AgIAAAAB_QICAAAAAf4CAgAAAAH_AgIA4wQAIQj4AggAAAAB-QIIAAAABPoCCAAAAAT7AggAAAAB_AIIAAAAAf0CCAAAAAH-AggAAAAB_wIIAOQEACEJ6wIAAOUEADDsAgAAwAQAEO0CAADlBAAw7wIBANsEACHwAgEA2wQAIfECAgDaBAAhgwMCANoEACGEAwEA2wQAIYUDAQDmBAAhDggAAN4EACAhAADoBAAgIgAA6AQAIPgCAQAAAAH5AgEAAAAF-gIBAAAABfsCAQAAAAH8AgEAAAAB_QIBAAAAAf4CAQAAAAH_AgEA5wQAIYADAQAAAAGBAwEAAAABggMBAAAAAQ4IAADeBAAgIQAA6AQAICIAAOgEACD4AgEAAAAB-QIBAAAABfoCAQAAAAX7AgEAAAAB_AIBAAAAAf0CAQAAAAH-AgEAAAAB_wIBAOcEACGAAwEAAAABgQMBAAAAAYIDAQAAAAEL-AIBAAAAAfkCAQAAAAX6AgEAAAAF-wIBAAAAAfwCAQAAAAH9AgEAAAAB_gIBAAAAAf8CAQDoBAAhgAMBAAAAAYEDAQAAAAGCAwEAAAABCOsCAADpBAAw7AIAAKoEABDtAgAA6QQAMO8CAQDbBAAh8AIBANsEACGDAwIA2gQAIYUDAQDmBAAhhgMBANsEACEI6wIAAOoEADDsAgAAlAQAEO0CAADqBAAw7gIBANsEACHvAgEA2wQAIYUDAQDmBAAhhwMCANoEACGIAwIA2gQAIQzrAgAA6wQAMOwCAAD-AwAQ7QIAAOsEADDuAgEA2wQAIYUDAQDmBAAhiQMBANsEACGKAwEA2wQAIYsDAQDbBAAhjAMBAOYEACGNAwEA2wQAIY4DAQDbBAAhjwMBANsEACEQCQAA8QQAIA0AAPAEACAOAADvBAAgmgIAAPIEACDrAgAA7AQAMOwCAADrAwAQ7QIAAOwEADDuAgEA7QQAIYUDAQDuBAAhiQMBAO0EACGKAwEA7QQAIYsDAQDtBAAhjAMBAO4EACGNAwEA7QQAIY4DAQDtBAAhjwMBAO0EACEL-AIBAAAAAfkCAQAAAAT6AgEAAAAE-wIBAAAAAfwCAQAAAAH9AgEAAAAB_gIBAAAAAf8CAQDiBAAhgAMBAAAAAYEDAQAAAAGCAwEAAAABC_gCAQAAAAH5AgEAAAAF-gIBAAAABfsCAQAAAAH8AgEAAAAB_QIBAAAAAf4CAQAAAAH_AgEA6AQAIYADAQAAAAGBAwEAAAABggMBAAAAAQOQAwAAygMAIJEDAADKAwAgkgMAAMoDACADkAMAAM4DACCRAwAAzgMAIJIDAADOAwAgA5ADAADSAwAgkQMAANIDACCSAwAA0gMAIAOQAwAA1gMAIJEDAADWAwAgkgMAANYDACARBAAA9wQAIAUAAPgEACAGAAD5BAAgmQIAAPYEACDrAgAA8wQAMOwCAADWAwAQ7QIAAPMEADDuAgIA9AQAIe8CAQDtBAAh8AIBAO0EACHxAgIA9AQAIfICAgD0BAAh8wIBAO0EACH0AgIA9AQAIfUCAgD0BAAh9gICAPUEACH3AgIA9QQAIQj4AgIAAAAB-QICAAAABPoCAgAAAAT7AgIAAAAB_AICAAAAAf0CAgAAAAH-AgIAAAAB_wICAOEEACEI-AICAAAAAfkCAgAAAAX6AgIAAAAF-wICAAAAAfwCAgAAAAH9AgIAAAAB_gICAAAAAf8CAgDeBAAhEgkAAPEEACANAADwBAAgDgAA7wQAIJoCAADyBAAg6wIAAOwEADDsAgAA6wMAEO0CAADsBAAw7gIBAO0EACGFAwEA7gQAIYkDAQDtBAAhigMBAO0EACGLAwEA7QQAIYwDAQDuBAAhjQMBAO0EACGOAwEA7QQAIY8DAQDtBAAhzAMAAOsDACDNAwAA6wMAIA4JAADxBAAgDQAA8AQAIJkCAAD2BAAgmgIAAPIEACDrAgAA_wQAMOwCAADKAwAQ7QIAAP8EADDuAgEA7QQAIe8CAQDtBAAhhQMBAO4EACGHAwIA9AQAIYgDAgD0BAAhzAMAAMoDACDNAwAAygMAIA4EAAD3BAAgCQAA8QQAIJkCAAD2BAAgmgIAAPIEACDrAgAA_QQAMOwCAADOAwAQ7QIAAP0EADDvAgEA7QQAIfACAQDtBAAhgwMCAPQEACGFAwEA7gQAIYYDAQDtBAAhzAMAAM4DACDNAwAAzgMAIA8EAAD3BAAgBQAA-AQAIJkCAAD2BAAgmgIAAPIEACDrAgAA-wQAMOwCAADSAwAQ7QIAAPsEADDvAgEA7QQAIfACAQDtBAAh8QICAPQEACGDAwIA9AQAIYQDAQDtBAAhhQMBAO4EACHMAwAA0gMAIM0DAADSAwAgBO8CAQAAAAHwAgEAAAAB8QICAAAAAYMDAgAAAAENBAAA9wQAIAUAAPgEACCZAgAA9gQAIJoCAADyBAAg6wIAAPsEADDsAgAA0gMAEO0CAAD7BAAw7wIBAO0EACHwAgEA7QQAIfECAgD0BAAhgwMCAPQEACGEAwEA7QQAIYUDAQDuBAAhA-8CAQAAAAHwAgEAAAABgwMCAAAAAQwEAAD3BAAgCQAA8QQAIJkCAAD2BAAgmgIAAPIEACDrAgAA_QQAMOwCAADOAwAQ7QIAAP0EADDvAgEA7QQAIfACAQDtBAAhgwMCAPQEACGFAwEA7gQAIYYDAQDtBAAhAu4CAQAAAAHvAgEAAAABDAkAAPEEACANAADwBAAgmQIAAPYEACCaAgAA8gQAIOsCAAD_BAAw7AIAAMoDABDtAgAA_wQAMO4CAQDtBAAh7wIBAO0EACGFAwEA7gQAIYcDAgD0BAAhiAMCAPQEACEK6wIAAIAFADDsAgAAxQMAEO0CAACABQAw7gICANoEACHwAgEA2wQAIfECAgDaBAAh8gICANwEACGFAwEA5gQAIZYDAQDbBAAhlwMBANsEACEK6wIAAIEFADDsAgAArQMAEO0CAACBBQAw8AIBANsEACHxAgIA2gQAIYMDAgDaBAAhhAMBANsEACGFAwEA5gQAIZcDAQDbBAAhmAMBANsEACEK6wIAAIIFADDsAgAAlwMAEO0CAACCBQAw8AIBANsEACHxAgIA2gQAIYMDAgDaBAAhhAMBANsEACGFAwEA5gQAIZYDAQDbBAAhlwMBANsEACEH6wIAAIMFADDsAgAAgQMAEO0CAACDBQAw8AIBANsEACGDAwIA2gQAIZYDAQDbBAAhmQMBANsEACEI6wIAAIQFADDsAgAA6wIAEO0CAACEBQAw8AIBANsEACGDAwIA2gQAIZYDAQDbBAAhmgMBANsEACGbAwEA2wQAIQjrAgAAhQUAMOwCAADVAgAQ7QIAAIUFADDwAgEA2wQAIYMDAgDaBAAhlgMBANsEACGaAwEA2wQAIZwDAQDbBAAhCesCAACGBQAw7AIAAL8CABDtAgAAhgUAMPACAQDbBAAhgwMCANoEACGFAwEA5gQAIYYDAQDbBAAhmAMBANsEACGdAwEA5gQAIQjrAgAAhwUAMOwCAACpAgAQ7QIAAIcFADDwAgEA2wQAIYMDAgDaBAAhhQMBAOYEACGGAwEA2wQAIZYDAQDbBAAhDusCAACIBQAw7AIAAJMCABDtAgAAiAUAMO4CAQDbBAAh9AICANwEACH1AgIA3AQAIYUDAQDmBAAhhgMBANsEACGYAwEA2wQAIZ4DAQDbBAAhnwMBANsEACGgAwEA5gQAIaEDAgDcBAAhogMCANwEACEM6wIAAIkFADDsAgAA_QEAEO0CAACJBQAw7gIBANsEACGFAwEA5gQAIYcDAgDaBAAhiAMCANoEACGJAwEA2wQAIZgDAQDbBAAhnQMBAOYEACGjAwEA2wQAIaQDAQDmBAAhDOsCAACKBQAw7AIAAOcBABDtAgAAigUAMO4CAQDbBAAhhQMBAOYEACGHAwIA2gQAIYgDAgDaBAAhiQMBANsEACGWAwEA2wQAIaMDAQDbBAAhpQMBAOYEACGmAyAAiwUAIQUIAADeBAAgIQAAjQUAICIAAI0FACD4AiAAAAAB_wIgAIwFACEFCAAA3gQAICEAAI0FACAiAACNBQAg-AIgAAAAAf8CIACMBQAhAvgCIAAAAAH_AiAAjQUAIQbrAgAAjgUAMOwCAADRAQAQ7QIAAI4FADCJAwEA2wQAIacDAQDbBAAhqAMBANsEACEG6wIAAI8FADDsAgAAvgEAEO0CAACPBQAwiQMBAO0EACGnAwEA7QQAIagDAQDtBAAhA4kDAQAAAAGnAwEAAAABqAMBAAAAAQjrAgAAkQUAMOwCAAC4AQAQ7QIAAJEFADCFAwEA2wQAIYkDAQDbBAAhlgMBANsEACGqAwEA2wQAIasDAgDaBAAhCOsCAACSBQAw7AIAAKUBABDtAgAAkgUAMIUDAQDtBAAhiQMBAO0EACGWAwEA7QQAIaoDAQDtBAAhqwMCAPQEACECiQMBAAAAAZYDAQAAAAEd6wIAAJQFADDsAgAAnwEAEO0CAACUBQAw7gIBANsEACGFAwEA5gQAIY8DAQDmBAAhlgMBANsEACGlAwEA2wQAIa0DAQDmBAAhrgMBAOYEACGvAwEA2wQAIbADAQDmBAAhsQMgAJUFACGyAwEA2wQAIbMDAQDbBAAhtAMBANsEACG1A0AAlgUAIbYDQACWBQAhtwMCANoEACG4AwIA2gQAIbkDAgDaBAAhugMCANoEACG7AwIA2gQAIbwDAgDaBAAhvQMCANoEACG-AwIA2gQAIb8DAgDaBAAhwANAAJcFACHBAwEA5gQAIQUIAADhBAAgIQAAnQUAICIAAJ0FACD4AiAAAAAB_wIgAJwFACELCAAA4QQAICEAAJsFACAiAACbBQAg-AJAAAAAAfkCQAAAAAT6AkAAAAAE-wJAAAAAAfwCQAAAAAH9AkAAAAAB_gJAAAAAAf8CQACaBQAhCwgAAN4EACAhAACZBQAgIgAAmQUAIPgCQAAAAAH5AkAAAAAF-gJAAAAABfsCQAAAAAH8AkAAAAAB_QJAAAAAAf4CQAAAAAH_AkAAmAUAIQsIAADeBAAgIQAAmQUAICIAAJkFACD4AkAAAAAB-QJAAAAABfoCQAAAAAX7AkAAAAAB_AJAAAAAAf0CQAAAAAH-AkAAAAAB_wJAAJgFACEI-AJAAAAAAfkCQAAAAAX6AkAAAAAF-wJAAAAAAfwCQAAAAAH9AkAAAAAB_gJAAAAAAf8CQACZBQAhCwgAAOEEACAhAACbBQAgIgAAmwUAIPgCQAAAAAH5AkAAAAAE-gJAAAAABPsCQAAAAAH8AkAAAAAB_QJAAAAAAf4CQAAAAAH_AkAAmgUAIQj4AkAAAAAB-QJAAAAABPoCQAAAAAT7AkAAAAAB_AJAAAAAAf0CQAAAAAH-AkAAAAAB_wJAAJsFACEFCAAA4QQAICEAAJ0FACAiAACdBQAg-AIgAAAAAf8CIACcBQAhAvgCIAAAAAH_AiAAnQUAIR3rAgAAngUAMOwCAACMAQAQ7QIAAJ4FADDuAgEA7QQAIYUDAQDuBAAhjwMBAO4EACGWAwEA7QQAIaUDAQDtBAAhrQMBAO4EACGuAwEA7gQAIa8DAQDtBAAhsAMBAO4EACGxAyAAnwUAIbIDAQDtBAAhswMBAO0EACG0AwEA7QQAIbUDQACgBQAhtgNAAKAFACG3AwIA9AQAIbgDAgD0BAAhuQMCAPQEACG6AwIA9AQAIbsDAgD0BAAhvAMCAPQEACG9AwIA9AQAIb4DAgD0BAAhvwMCAPQEACHAA0AAoQUAIcEDAQDuBAAhAvgCIAAAAAH_AiAAnQUAIQj4AkAAAAAB-QJAAAAABPoCQAAAAAT7AkAAAAAB_AJAAAAAAf0CQAAAAAH-AkAAAAAB_wJAAJsFACEI-AJAAAAAAfkCQAAAAAX6AkAAAAAF-wJAAAAAAfwCQAAAAAH9AkAAAAAB_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_ACAQAAAAGDAwIAAAABlgMBAAAAAQoDAAC_BQAgBAAAvgUAIAUAAMAFACDrAgAAvQUAMOwCAAAeABDtAgAAvQUAMPACAQDtBAAhgwMCAPQEACGWAwEA7QQAIZkDAQDtBAAhFQMAAL8FACAHAAC4BQAgCQAAtwUAIAoAALkFACALAAC6BQAgDAAAuwUAIA0AALYFACDrAgAAzQUAMOwCAAADABDtAgAAzQUAMO4CAQDtBAAhhQMBAO4EACGHAwIA9AQAIYgDAgD0BAAhiQMBAO0EACGWAwEA7QQAIaMDAQDtBAAhpQMBAO4EACGmAyAAzgUAIcwDAAADACDNAwAAAwAgFwcAALgFACAJAAC3BQAgCgAAuQUAIAsAALoFACAMAAC7BQAgDQAAtgUAIA4AALUFACDrAgAAtAUAMOwCAABAABDtAgAAtAUAMO4CAQDtBAAhhQMBAO4EACGJAwEA7QQAIYoDAQDtBAAhiwMBAO0EACGMAwEA7gQAIY0DAQDtBAAhjgMBAO0EACGPAwEA7QQAIcIDAQDuBAAhxgMBAO4EACHMAwAAQAAgzQMAAEAAIBEDAAC_BQAgBAAAvgUAIAcAALgFACAJAAC3BQAgCgAAuQUAIAsAALoFACAMAAC7BQAg6wIAAMsFADDsAgAABwAQ7QIAAMsFADDwAgEA7QQAIYMDAgD0BAAhhQMBAO4EACGGAwEA7QQAIZYDAQDtBAAhzAMAAAcAIM0DAAAHACAE8AIBAAAAAYMDAgAAAAGWAwEAAAABmgMBAAAAAQsDAAC_BQAgBAAAvgUAIAUAAMAFACDrAgAAwgUAMOwCAAAaABDtAgAAwgUAMPACAQDtBAAhgwMCAPQEACGWAwEA7QQAIZoDAQDtBAAhmwMBAO0EACEE8AIBAAAAAYMDAgAAAAGWAwEAAAABmgMBAAAAAQsDAAC_BQAgBAAAvgUAIAUAAMAFACDrAgAAxAUAMOwCAAAWABDtAgAAxAUAMPACAQDtBAAhgwMCAPQEACGWAwEA7QQAIZoDAQDtBAAhnAMBAO0EACEE7gICAAAAAfACAQAAAAHxAgIAAAABlgMBAAAAAQ4DAAC_BQAgBAAAvgUAIAUAAMAFACAGAADHBQAg6wIAAMYFADDsAgAADwAQ7QIAAMYFADDuAgIA9AQAIfACAQDtBAAh8QICAPQEACHyAgIA9QQAIYUDAQDuBAAhlgMBAO0EACGXAwEA7QQAIRADAAC_BQAgBAAAvgUAIAUAAMAFACAHAAC4BQAg6wIAAMkFADDsAgAACwAQ7QIAAMkFADDwAgEA7QQAIfECAgD0BAAhgwMCAPQEACGEAwEA7QQAIYUDAQDuBAAhlgMBAO0EACGXAwEA7QQAIcwDAAALACDNAwAACwAgBPACAQAAAAHxAgIAAAABgwMCAAAAAZYDAQAAAAEOAwAAvwUAIAQAAL4FACAFAADABQAgBwAAuAUAIOsCAADJBQAw7AIAAAsAEO0CAADJBQAw8AIBAO0EACHxAgIA9AQAIYMDAgD0BAAhhAMBAO0EACGFAwEA7gQAIZYDAQDtBAAhlwMBAO0EACED8AIBAAAAAYMDAgAAAAGWAwEAAAABDwMAAL8FACAEAAC-BQAgBwAAuAUAIAkAALcFACAKAAC5BQAgCwAAugUAIAwAALsFACDrAgAAywUAMOwCAAAHABDtAgAAywUAMPACAQDtBAAhgwMCAPQEACGFAwEA7gQAIYYDAQDtBAAhlgMBAO0EACEC7gIBAAAAAZYDAQAAAAETAwAAvwUAIAcAALgFACAJAAC3BQAgCgAAuQUAIAsAALoFACAMAAC7BQAgDQAAtgUAIOsCAADNBQAw7AIAAAMAEO0CAADNBQAw7gIBAO0EACGFAwEA7gQAIYcDAgD0BAAhiAMCAPQEACGJAwEA7QQAIZYDAQDtBAAhowMBAO0EACGlAwEA7gQAIaYDIADOBQAhAvgCIAAAAAH_AiAAjQUAIQAAAAAAAAHRAwEAAAABBdEDAgAAAAHXAwIAAAAB2AMCAAAAAdkDAgAAAAHaAwIAAAABBdEDAgAAAAHXAwIAAAAB2AMCAAAAAdkDAgAAAAHaAwIAAAABBRsAAJ4MACAcAACqDAAgzgMAAJ8MACDPAwAAqQwAINQDAADIAwAgBRsAAJwMACAcAACnDAAgzgMAAJ0MACDPAwAApgwAINQDAADMAwAgBRsAAJoMACAcAACkDAAgzgMAAJsMACDPAwAAowwAINQDAADQAwAgBRsAAJgMACAcAAChDAAgzgMAAJkMACDPAwAAoAwAINQDAADUAwAgAxsAAJ4MACDOAwAAnwwAINQDAADIAwAgAxsAAJwMACDOAwAAnQwAINQDAADMAwAgAxsAAJoMACDOAwAAmwwAINQDAADQAwAgAxsAAJgMACDOAwAAmQwAINQDAADUAwAgAAAAAAAB0QMBAAAAAQUbAACMDAAgHAAAlgwAIM4DAACNDAAgzwMAAJUMACDUAwAA0AMAIAUbAACKDAAgHAAAkwwAIM4DAACLDAAgzwMAAJIMACDUAwAAzAMAIAUbAACIDAAgHAAAkAwAIM4DAACJDAAgzwMAAI8MACDUAwAAyAMAIAsbAADqBQAwHAAA7wUAMM4DAADrBQAwzwMAAOwFADDQAwAA7QUAINEDAADuBQAw0gMAAO4FADDTAwAA7gUAMNQDAADuBQAw1QMAAPAFADDWAwAA8QUAMAkEAADdBQAgBQAA3gUAIJkCAADcBQAg7gICAAAAAfMCAQAAAAH0AgIAAAAB9QICAAAAAfYCAgAAAAH3AgIAAAABAgAAANgDACAbAAD1BQAgAwAAANgDACAbAAD1BQAgHAAA9AUAIAEUAACODAAwEQQAAPcEACAFAAD4BAAgBgAA-QQAIJkCAAD2BAAg6wIAAPMEADDsAgAA1gMAEO0CAADzBAAw7gICAAAAAe8CAQDtBAAh8AIBAO0EACHxAgIA9AQAIfICAgD0BAAh8wIBAO0EACH0AgIA9AQAIfUCAgD0BAAh9gICAPUEACH3AgIA9QQAIQIAAADYAwAgFAAA9AUAIAIAAADyBQAgFAAA8wUAIA3rAgAA8QUAMOwCAADyBQAQ7QIAAPEFADDuAgIA9AQAIe8CAQDtBAAh8AIBAO0EACHxAgIA9AQAIfICAgD0BAAh8wIBAO0EACH0AgIA9AQAIfUCAgD0BAAh9gICAPUEACH3AgIA9QQAIQ3rAgAA8QUAMOwCAADyBQAQ7QIAAPEFADDuAgIA9AQAIe8CAQDtBAAh8AIBAO0EACHxAgIA9AQAIfICAgD0BAAh8wIBAO0EACH0AgIA9AQAIfUCAgD0BAAh9gICAPUEACH3AgIA9QQAIQbuAgIA1gUAIfMCAQDVBQAh9AICANYFACH1AgIA1gUAIfYCAgDXBQAh9wICANcFACEJBAAA2QUAIAUAANoFACCZAgAA2AUAIO4CAgDWBQAh8wIBANUFACH0AgIA1gUAIfUCAgDWBQAh9gICANcFACH3AgIA1wUAIQkEAADdBQAgBQAA3gUAIJkCAADcBQAg7gICAAAAAfMCAQAAAAH0AgIAAAAB9QICAAAAAfYCAgAAAAH3AgIAAAABAxsAAIwMACDOAwAAjQwAINQDAADQAwAgAxsAAIoMACDOAwAAiwwAINQDAADMAwAgAxsAAIgMACDOAwAAiQwAINQDAADIAwAgBBsAAOoFADDOAwAA6wUAMNADAADtBQAg1AMAAO4FADAAAAAAAAUbAAD-CwAgHAAAhgwAIM4DAAD_CwAgzwMAAIUMACDUAwAAzAMAIAUbAAD8CwAgHAAAgwwAIM4DAAD9CwAgzwMAAIIMACDUAwAAyAMAIAsbAACMBgAwHAAAkQYAMM4DAACNBgAwzwMAAI4GADDQAwAAjwYAINEDAACQBgAw0gMAAJAGADDTAwAAkAYAMNQDAACQBgAw1QMAAJIGADDWAwAAkwYAMAsbAACDBgAwHAAAhwYAMM4DAACEBgAwzwMAAIUGADDQAwAAhgYAINEDAADuBQAw0gMAAO4FADDTAwAA7gUAMNQDAADuBQAw1QMAAIgGADDWAwAA8QUAMAoEAADdBQAgBgAA3wUAIJkCAADcBQAg7gICAAAAAfICAgAAAAHzAgEAAAAB9AICAAAAAfUCAgAAAAH2AgIAAAAB9wICAAAAAQIAAADYAwAgGwAAiwYAIAMAAADYAwAgGwAAiwYAIBwAAIoGACABFAAAgQwAMAIAAADYAwAgFAAAigYAIAIAAADyBQAgFAAAiQYAIAfuAgIA1gUAIfICAgDWBQAh8wIBANUFACH0AgIA1gUAIfUCAgDWBQAh9gICANcFACH3AgIA1wUAIQoEAADZBQAgBgAA2wUAIJkCAADYBQAg7gICANYFACHyAgIA1gUAIfMCAQDVBQAh9AICANYFACH1AgIA1gUAIfYCAgDXBQAh9wICANcFACEKBAAA3QUAIAYAAN8FACCZAgAA3AUAIO4CAgAAAAHyAgIAAAAB8wIBAAAAAfQCAgAAAAH1AgIAAAAB9gICAAAAAfcCAgAAAAEGBAAA9wUAIJkCAAD4BQAgmgIAAPkFACCDAwIAAAABhAMBAAAAAYUDAQAAAAECAAAA1AMAIBsAAJcGACADAAAA1AMAIBsAAJcGACAcAACWBgAgARQAAIAMADAOBAAA9wQAIAUAAPgEACCZAgAA9gQAIJoCAADyBAAg6wIAAPsEADDsAgAA0gMAEO0CAAD7BAAw7wIBAO0EACHwAgEA7QQAIfECAgD0BAAhgwMCAPQEACGEAwEA7QQAIYUDAQDuBAAhkwMAAPoEACACAAAA1AMAIBQAAJYGACACAAAAlAYAIBQAAJUGACAJ6wIAAJMGADDsAgAAlAYAEO0CAACTBgAw7wIBAO0EACHwAgEA7QQAIfECAgD0BAAhgwMCAPQEACGEAwEA7QQAIYUDAQDuBAAhCesCAACTBgAw7AIAAJQGABDtAgAAkwYAMO8CAQDtBAAh8AIBAO0EACHxAgIA9AQAIYMDAgD0BAAhhAMBAO0EACGFAwEA7gQAIQODAwIA1gUAIYQDAQDVBQAhhQMBAOUFACEGBAAA5wUAIJkCAADoBQAgmgIAAOkFACCDAwIA1gUAIYQDAQDVBQAhhQMBAOUFACEGBAAA9wUAIJkCAAD4BQAgmgIAAPkFACCDAwIAAAABhAMBAAAAAYUDAQAAAAEDGwAA_gsAIM4DAAD_CwAg1AMAAMwDACADGwAA_AsAIM4DAAD9CwAg1AMAAMgDACAEGwAAjAYAMM4DAACNBgAw0AMAAI8GACDUAwAAkAYAMAQbAACDBgAwzgMAAIQGADDQAwAAhgYAINQDAADuBQAwAAAAAAAFGwAA9AsAIBwAAPoLACDOAwAA9QsAIM8DAAD5CwAg1AMAAMgDACALGwAAtwYAMBwAALwGADDOAwAAuAYAMM8DAAC5BgAw0AMAALoGACDRAwAAuwYAMNIDAAC7BgAw0wMAALsGADDUAwAAuwYAMNUDAAC9BgAw1gMAAL4GADALGwAArgYAMBwAALIGADDOAwAArwYAMM8DAACwBgAw0AMAALEGACDRAwAAkAYAMNIDAACQBgAw0wMAAJAGADDUAwAAkAYAMNUDAACzBgAw1gMAAJMGADALGwAApQYAMBwAAKkGADDOAwAApgYAMM8DAACnBgAw0AMAAKgGACDRAwAA7gUAMNIDAADuBQAw0wMAAO4FADDUAwAA7gUAMNUDAACqBgAw1gMAAPEFADALBQAA3gUAIAYAAN8FACCZAgAA3AUAIO4CAgAAAAHxAgIAAAAB8gICAAAAAfMCAQAAAAH0AgIAAAAB9QICAAAAAfYCAgAAAAH3AgIAAAABAgAAANgDACAbAACtBgAgAwAAANgDACAbAACtBgAgHAAArAYAIAEUAAD4CwAwAgAAANgDACAUAACsBgAgAgAAAPIFACAUAACrBgAgCO4CAgDWBQAh8QICANYFACHyAgIA1gUAIfMCAQDVBQAh9AICANYFACH1AgIA1gUAIfYCAgDXBQAh9wICANcFACELBQAA2gUAIAYAANsFACCZAgAA2AUAIO4CAgDWBQAh8QICANYFACHyAgIA1gUAIfMCAQDVBQAh9AICANYFACH1AgIA1gUAIfYCAgDXBQAh9wICANcFACELBQAA3gUAIAYAAN8FACCZAgAA3AUAIO4CAgAAAAHxAgIAAAAB8gICAAAAAfMCAQAAAAH0AgIAAAAB9QICAAAAAfYCAgAAAAH3AgIAAAABBwUAAPYFACCZAgAA-AUAIJoCAAD5BQAg8QICAAAAAYMDAgAAAAGEAwEAAAABhQMBAAAAAQIAAADUAwAgGwAAtgYAIAMAAADUAwAgGwAAtgYAIBwAALUGACABFAAA9wsAMAIAAADUAwAgFAAAtQYAIAIAAACUBgAgFAAAtAYAIATxAgIA1gUAIYMDAgDWBQAhhAMBANUFACGFAwEA5QUAIQcFAADmBQAgmQIAAOgFACCaAgAA6QUAIPECAgDWBQAhgwMCANYFACGEAwEA1QUAIYUDAQDlBQAhBwUAAPYFACCZAgAA-AUAIJoCAAD5BQAg8QICAAAAAYMDAgAAAAGEAwEAAAABhQMBAAAAAQYJAACaBgAgmQIAAJkGACCaAgAAmwYAIIMDAgAAAAGFAwEAAAABhgMBAAAAAQIAAADQAwAgGwAAwgYAIAMAAADQAwAgGwAAwgYAIBwAAMEGACABFAAA9gsAMA0EAAD3BAAgCQAA8QQAIJkCAAD2BAAgmgIAAPIEACDrAgAA_QQAMOwCAADOAwAQ7QIAAP0EADDvAgEA7QQAIfACAQDtBAAhgwMCAPQEACGFAwEA7gQAIYYDAQDtBAAhlAMAAPwEACACAAAA0AMAIBQAAMEGACACAAAAvwYAIBQAAMAGACAI6wIAAL4GADDsAgAAvwYAEO0CAAC-BgAw7wIBAO0EACHwAgEA7QQAIYMDAgD0BAAhhQMBAO4EACGGAwEA7QQAIQjrAgAAvgYAMOwCAAC_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_wQAMOwCAADKAwAQ7QIAAP8EADDuAgEA7QQAIe8CAQDtBAAhhQMBAO4EACGHAwIA9AQAIYgDAgD0BAAhlQMAAP4EACACAAAAzAMAIBQAAPMGACACAAAA8QYAIBQAAPIGACAI6wIAAPAGADDsAgAA8QYAEO0CAADwBgAw7gIBAO0EACHvAgEA7QQAIYUDAQDuBAAhhwMCAPQEACGIAwIA9AQAIQjrAgAA8AYAMOwCAADxBgAQ7QIAAPAGADDuAgEA7QQAIe8CAQDtBAAhhQMBAO4EACGHAwIA9AQAIYgDAgD0BAAhBO4CAQDVBQAhhQMBAOUFACGHAwIA1gUAIYgDAgDWBQAhBwkAAKMGACANAACiBgAgmgIAAKQGACDuAgEA1QUAIYUDAQDlBQAhhwMCANYFACGIAwIA1gUAIQcJAADFBgAgDQAAxAYAIJoCAADGBgAg7gIBAAAAAYUDAQAAAAGHAwIAAAABiAMCAAAAAQQbAADpBgAwzgMAAOoGADDQAwAA7AYAINQDAADtBgAwBBsAAOAGADDOAwAA4QYAMNADAADjBgAg1AMAALsGADAEGwAA1wYAMM4DAADYBgAw0AMAANoGACDUAwAAkAYAMAQbAADOBgAwzgMAAM8GADDQAwAA0QYAINQDAADuBQAwAAAAAAYJAAD7BgAgDQAA-gYAIA4AAPkGACCaAgAA_AYAIIUDAADPBQAgjAMAAM8FACAFCQAA-wYAIA0AAPoGACCZAgAA_QYAIJoCAAD8BgAghQMAAM8FACAFBAAA_gYAIAkAAPsGACCZAgAA_QYAIJoCAAD8BgAghQMAAM8FACAFBAAA_gYAIAUAAP8GACCZAgAA_QYAIJoCAAD8BgAghQMAAM8FACAAAAAAAAUbAADiCwAgHAAA7gsAIM4DAADjCwAgzwMAAO0LACDUAwAACQAgBRsAAOALACAcAADrCwAgzgMAAOELACDPAwAA6gsAINQDAAAFACAFGwAA3gsAIBwAAOgLACDOAwAA3wsAIM8DAADnCwAg1AMAAAEAIAcbAADcCwAgHAAA5QsAIM4DAADdCwAgzwMAAOQLACDSAwAACwAg0wMAAAsAINQDAAANACADGwAA4gsAIM4DAADjCwAg1AMAAAkAIAMbAADgCwAgzgMAAOELACDUAwAABQAgAxsAAN4LACDOAwAA3wsAINQDAAABACADGwAA3AsAIM4DAADdCwAg1AMAAA0AIAAAAAAABRsAANELACAcAADaCwAgzgMAANILACDPAwAA2QsAINQDAABeACAFGwAAzwsAIBwAANcLACDOAwAA0AsAIM8DAADWCwAg1AMAAFoAIAUbAADNCwAgHAAA1AsAIM4DAADOCwAgzwMAANMLACDUAwAAVgAgAxsAANELACDOAwAA0gsAINQDAABeACADGwAAzwsAIM4DAADQCwAg1AMAAFoAIAMbAADNCwAgzgMAAM4LACDUAwAAVgAgAAAAAAAFGwAAwQsAIBwAAMsLACDOAwAAwgsAIM8DAADKCwAg1AMAAAkAIAUbAAC_CwAgHAAAyAsAIM4DAADACwAgzwMAAMcLACDUAwAABQAgBRsAAL0LACAcAADFCwAgzgMAAL4LACDPAwAAxAsAINQDAAABACALGwAAogcAMBwAAKcHADDOAwAAowcAMM8DAACkBwAw0AMAAKUHACDRAwAApgcAMNIDAACmBwAw0wMAAKYHADDUAwAApgcAMNUDAACoBwAw1gMAAKkHADAGAwAAjAcAIAQAAIsHACAFAACKBwAg7gICAAAAAYUDAQAAAAGXAwEAAAABAgAAABEAIBsAAK0HACADAAAAEQAgGwAArQcAIBwAAKwHACABFAAAwwsAMA8DAAC_BQAgBAAAvgUAIAUAAMAFACAGAADHBQAg6wIAAMYFADDsAgAADwAQ7QIAAMYFADDuAgIA9AQAIfACAQDtBAAh8QICAPQEACHyAgIA9QQAIYUDAQDuBAAhlgMBAO0EACGXAwEA7QQAIckDAADFBQAgAgAAABEAIBQAAKwHACACAAAAqgcAIBQAAKsHACAK6wIAAKkHADDsAgAAqgcAEO0CAACpBwAw7gICAPQEACHwAgEA7QQAIfECAgD0BAAh8gICAPUEACGFAwEA7gQAIZYDAQDtBAAhlwMBAO0EACEK6wIAAKkHADDsAgAAqgcAEO0CAACpBwAw7gICAPQEACHwAgEA7QQAIfECAgD0BAAh8gICAPUEACGFAwEA7gQAIZYDAQDtBAAhlwMBAO0EACED7gICANYFACGFAwEA5QUAIZcDAQDVBQAhBgMAAIgHACAEAACHBwAgBQAAhgcAIO4CAgDWBQAhhQMBAOUFACGXAwEA1QUAIQYDAACMBwAgBAAAiwcAIAUAAIoHACDuAgIAAAABhQMBAAAAAZcDAQAAAAEDGwAAwQsAIM4DAADCCwAg1AMAAAkAIAMbAAC_CwAgzgMAAMALACDUAwAABQAgAxsAAL0LACDOAwAAvgsAINQDAAABACAEGwAAogcAMM4DAACjBwAw0AMAAKUHACDUAwAApgcAMAAAAAAABRsAALILACAcAAC7CwAgzgMAALMLACDPAwAAugsAINQDAAAFACAFGwAAsAsAIBwAALgLACDOAwAAsQsAIM8DAAC3CwAg1AMAAAEAIAUbAACuCwAgHAAAtQsAIM4DAACvCwAgzwMAALQLACDUAwAACQAgAxsAALILACDOAwAAswsAINQDAAAFACADGwAAsAsAIM4DAACxCwAg1AMAAAEAIAMbAACuCwAgzgMAAK8LACDUAwAACQAgAAAAAAAFGwAAowsAIBwAAKwLACDOAwAApAsAIM8DAACrCwAg1AMAAAUAIAUbAAChCwAgHAAAqQsAIM4DAACiCwAgzwMAAKgLACDUAwAAAQAgBRsAAJ8LACAcAACmCwAgzgMAAKALACDPAwAApQsAINQDAAAJACADGwAAowsAIM4DAACkCwAg1AMAAAUAIAMbAAChCwAgzgMAAKILACDUAwAAAQAgAxsAAJ8LACDOAwAAoAsAINQDAAAJACAAAAAAAAUbAACUCwAgHAAAnQsAIM4DAACVCwAgzwMAAJwLACDUAwAABQAgBRsAAJILACAcAACaCwAgzgMAAJMLACDPAwAAmQsAINQDAAABACAFGwAAkAsAIBwAAJcLACDOAwAAkQsAIM8DAACWCwAg1AMAAAkAIAMbAACUCwAgzgMAAJULACDUAwAABQAgAxsAAJILACDOAwAAkwsAINQDAAABACADGwAAkAsAIM4DAACRCwAg1AMAAAkAIAAAAAAABRsAAIcLACAcAACOCwAgzgMAAIgLACDPAwAAjQsAINQDAABaACAFGwAAhQsAIBwAAIsLACDOAwAAhgsAIM8DAACKCwAg1AMAAFYAIAsbAADbBwAwHAAA4AcAMM4DAADcBwAwzwMAAN0HADDQAwAA3gcAINEDAADfBwAw0gMAAN8HADDTAwAA3wcAMNQDAADfBwAw1QMAAOEHADDWAwAA4gcAMAYEAACXBwAgJQAAmAcAIIMDAgAAAAGEAwEAAAABhQMBAAAAAZcDAQAAAAECAAAAYgAgGwAA5gcAIAMAAABiACAbAADmBwAgHAAA5QcAIAEUAACJCwAwDgQAAK4FACAFAACtBQAgJQAAqgUAIOsCAACsBQAw7AIAAGAAEO0CAACsBQAw8AIBAO0EACHxAgIA9AQAIYMDAgD0BAAhhAMBAO0EACGFAwEA7gQAIZcDAQDtBAAhmAMBAO0EACHEAwAAqwUAIAIAAABiACAUAADlBwAgAgAAAOMHACAUAADkBwAgCusCAADiBwAw7AIAAOMHABDtAgAA4gcAMPACAQDtBAAh8QICAPQEACGDAwIA9AQAIYQDAQDtBAAhhQMBAO4EACGXAwEA7QQAIZgDAQDtBAAhCusCAADiBwAw7AIAAOMHABDtAgAA4gcAMPACAQDtBAAh8QICAPQEACGDAwIA9AQAIYQDAQDtBAAhhQMBAO4EACGXAwEA7QQAIZgDAQDtBAAhBIMDAgDWBQAhhAMBANUFACGFAwEA5QUAIZcDAQDVBQAhBgQAAJQHACAlAACVBwAggwMCANYFACGEAwEA1QUAIYUDAQDlBQAhlwMBANUFACEGBAAAlwcAICUAAJgHACCDAwIAAAABhAMBAAAAAYUDAQAAAAGXAwEAAAABAxsAAIcLACDOAwAAiAsAINQDAABaACADGwAAhQsAIM4DAACGCwAg1AMAAFYAIAQbAADbBwAwzgMAANwHADDQAwAA3gcAINQDAADfBwAwAAAAAAAFGwAA-AoAIBwAAIMLACDOAwAA-QoAIM8DAACCCwAg1AMAAAUAIAUbAAD2CgAgHAAAgAsAIM4DAAD3CgAgzwMAAP8KACDUAwAAAQAgCxsAAKMIADAcAACoCAAwzgMAAKQIADDPAwAApQgAMNADAACmCAAg0QMAAKcIADDSAwAApwgAMNMDAACnCAAw1AMAAKcIADDVAwAAqQgAMNYDAACqCAAwCxsAAJoIADAcAACeCAAwzgMAAJsIADDPAwAAnAgAMNADAACdCAAg0QMAAKYHADDSAwAApgcAMNMDAACmBwAw1AMAAKYHADDVAwAAnwgAMNYDAACpBwAwCxsAAI4IADAcAACTCAAwzgMAAI8IADDPAwAAkAgAMNADAACRCAAg0QMAAJIIADDSAwAAkggAMNMDAACSCAAw1AMAAJIIADDVAwAAlAgAMNYDAACVCAAwCxsAAIIIADAcAACHCAAwzgMAAIMIADDPAwAAhAgAMNADAACFCAAg0QMAAIYIADDSAwAAhggAMNMDAACGCAAw1AMAAIYIADDVAwAAiAgAMNYDAACJCAAwCxsAAPYHADAcAAD7BwAwzgMAAPcHADDPAwAA-AcAMNADAAD5BwAg0QMAAPoHADDSAwAA-gcAMNMDAAD6BwAw1AMAAPoHADDVAwAA_AcAMNYDAAD9BwAwAwMAALsHACAEAAC6BwAgmQMBAAAAAQIAAAAgACAbAACBCAAgAwAAACAAIBsAAIEIACAcAACACAAgARQAAP4KADALAwAAvwUAIAQAAL4FACAFAADABQAg6wIAAL0FADDsAgAAHgAQ7QIAAL0FADDwAgEA7QQAIYMDAgD0BAAhlgMBAO0EACGZAwEA7QQAIccDAAC8BQAgAgAAACAAIBQAAIAIACACAAAA_gcAIBQAAP8HACAH6wIAAP0HADDsAgAA_gcAEO0CAAD9BwAw8AIBAO0EACGDAwIA9AQAIZYDAQDtBAAhmQMBAO0EACEH6wIAAP0HADDsAgAA_gcAEO0CAAD9BwAw8AIBAO0EACGDAwIA9AQAIZYDAQDtBAAhmQMBAO0EACEBmQMBANUFACEDAwAAuAcAIAQAALcHACCZAwEA1QUAIQMDAAC7BwAgBAAAugcAIJkDAQAAAAEEAwAAxgcAIAQAAMUHACCaAwEAAAABmwMBAAAAAQIAAAAcACAbAACNCAAgAwAAABwAIBsAAI0IACAcAACMCAAgARQAAP0KADAMAwAAvwUAIAQAAL4FACAFAADABQAg6wIAAMIFADDsAgAAGgAQ7QIAAMIFADDwAgEA7QQAIYMDAgD0BAAhlgMBAO0EACGaAwEA7QQAIZsDAQDtBAAhyAMAAMEFACACAAAAHAAgFAAAjAgAIAIAAACKCAAgFAAAiwgAIAjrAgAAiQgAMOwCAACKCAAQ7QIAAIkIADDwAgEA7QQAIYMDAgD0BAAhlgMBAO0EACGaAwEA7QQAIZsDAQDtBAAhCOsCAACJCAAw7AIAAIoIABDtAgAAiQgAMPACAQDtBAAhgwMCAPQEACGWAwEA7QQAIZoDAQDtBAAhmwMBAO0EACECmgMBANUFACGbAwEA1QUAIQQDAADDBwAgBAAAwgcAIJoDAQDVBQAhmwMBANUFACEEAwAAxgcAIAQAAMUHACCaAwEAAAABmwMBAAAAAQQDAADRBwAgBAAA0AcAIJoDAQAAAAGcAwEAAAABAgAAABgAIBsAAJkIACADAAAAGAAgGwAAmQgAIBwAAJgIACABFAAA_AoAMAwDAAC_BQAgBAAAvgUAIAUAAMAFACDrAgAAxAUAMOwCAAAWABDtAgAAxAUAMPACAQDtBAAhgwMCAPQEACGWAwEA7QQAIZoDAQDtBAAhnAMBAO0EACHIAwAAwwUAIAIAAAAYACAUAACYCAAgAgAAAJYIACAUAACXCAAgCOsCAACVCAAw7AIAAJYIABDtAgAAlQgAMPACAQDtBAAhgwMCAPQEACGWAwEA7QQAIZoDAQDtBAAhnAMBAO0EACEI6wIAAJUIADDsAgAAlggAEO0CAACVCAAw8AIBAO0EACGDAwIA9AQAIZYDAQDtBAAhmgMBAO0EACGcAwEA7QQAIQKaAwEA1QUAIZwDAQDVBQAhBAMAAM4HACAEAADNBwAgmgMBANUFACGcAwEA1QUAIQQDAADRBwAgBAAA0AcAIJoDAQAAAAGcAwEAAAABBwMAAIwHACAEAACLBwAgBgAAjQcAIO4CAgAAAAHyAgIAAAABhQMBAAAAAZcDAQAAAAECAAAAEQAgGwAAoggAIAMAAAARACAbAACiCAAgHAAAoQgAIAEUAAD7CgAwAgAAABEAIBQAAKEIACACAAAAqgcAIBQAAKAIACAE7gICANYFACHyAgIA1wUAIYUDAQDlBQAhlwMBANUFACEHAwAAiAcAIAQAAIcHACAGAACJBwAg7gICANYFACHyAgIA1wUAIYUDAQDlBQAhlwMBANUFACEHAwAAjAcAIAQAAIsHACAGAACNBwAg7gICAAAAAfICAgAAAAGFAwEAAAABlwMBAAAAAQcDAACwBwAgBAAArwcAIAcAALEHACCDAwIAAAABhAMBAAAAAYUDAQAAAAGXAwEAAAABAgAAAA0AIBsAAK4IACADAAAADQAgGwAArggAIBwAAK0IACABFAAA-goAMA8DAAC_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_wgAINEDAACSCAAw0gMAAJIIADDTAwAAkggAMNQDAACSCAAw1QMAAIEJADDWAwAAlQgAMAsbAADzCAAwHAAA9wgAMM4DAAD0CAAwzwMAAPUIADDQAwAA9ggAINEDAACGCAAw0gMAAIYIADDTAwAAhggAMNQDAACGCAAw1QMAAPgIADDWAwAAiQgAMAsbAADqCAAwHAAA7ggAMM4DAADrCAAwzwMAAOwIADDQAwAA7QgAINEDAAD6BwAw0gMAAPoHADDTAwAA-gcAMNQDAAD6BwAw1QMAAO8IADDWAwAA_QcAMAQDAAC7BwAgBQAAvAcAIIMDAgAAAAGZAwEAAAABAgAAACAAIBsAAPIIACADAAAAIAAgGwAA8ggAIBwAAPEIACABFAAA5goAMAIAAAAgACAUAADxCAAgAgAAAP4HACAUAADwCAAgAoMDAgDWBQAhmQMBANUFACEEAwAAuAcAIAUAALkHACCDAwIA1gUAIZkDAQDVBQAhBAMAALsHACAFAAC8BwAggwMCAAAAAZkDAQAAAAEFAwAAxgcAIAUAAMcHACCDAwIAAAABmgMBAAAAAZsDAQAAAAECAAAAHAAgGwAA-wgAIAMAAAAcACAbAAD7CAAgHAAA-ggAIAEUAADlCgAwAgAAABwAIBQAAPoIACACAAAAiggAIBQAAPkIACADgwMCANYFACGaAwEA1QUAIZsDAQDVBQAhBQMAAMMHACAFAADEBwAggwMCANYFACGaAwEA1QUAIZsDAQDVBQAhBQMAAMYHACAFAADHBwAggwMCAAAAAZoDAQAAAAGbAwEAAAABBQMAANEHACAFAADSBwAggwMCAAAAAZoDAQAAAAGcAwEAAAABAgAAABgAIBsAAIQJACADAAAAGAAgGwAAhAkAIBwAAIMJACABFAAA5AoAMAIAAAAYACAUAACDCQAgAgAAAJYIACAUAACCCQAgA4MDAgDWBQAhmgMBANUFACGcAwEA1QUAIQUDAADOBwAgBQAAzwcAIIMDAgDWBQAhmgMBANUFACGcAwEA1QUAIQUDAADRBwAgBQAA0gcAIIMDAgAAAAGaAwEAAAABnAMBAAAAAQgDAACMBwAgBQAAigcAIAYAAI0HACDuAgIAAAAB8QICAAAAAfICAgAAAAGFAwEAAAABlwMBAAAAAQIAAAARACAbAACNCQAgAwAAABEAIBsAAI0JACAcAACMCQAgARQAAOMKADACAAAAEQAgFAAAjAkAIAIAAACqBwAgFAAAiwkAIAXuAgIA1gUAIfECAgDWBQAh8gICANcFACGFAwEA5QUAIZcDAQDVBQAhCAMAAIgHACAFAACGBwAgBgAAiQcAIO4CAgDWBQAh8QICANYFACHyAgIA1wUAIYUDAQDlBQAhlwMBANUFACEIAwAAjAcAIAUAAIoHACAGAACNBwAg7gICAAAAAfECAgAAAAHyAgIAAAABhQMBAAAAAZcDAQAAAAEIAwAAsAcAIAUAAK4HACAHAACxBwAg8QICAAAAAYMDAgAAAAGEAwEAAAABhQMBAAAAAZcDAQAAAAECAAAADQAgGwAAlgkAIAMAAAANACAbAACWCQAgHAAAlQkAIAEUAADiCgAwAgAAAA0AIBQAAJUJACACAAAAqwgAIBQAAJQJACAF8QICANYFACGDAwIA1gUAIYQDAQDVBQAhhQMBAOUFACGXAwEA1QUAIQgDAACgBwAgBQAAngcAIAcAAKEHACDxAgIA1gUAIYMDAgDWBQAhhAMBANUFACGFAwEA5QUAIZcDAQDVBQAhCAMAALAHACAFAACuBwAgBwAAsQcAIPECAgAAAAGDAwIAAAABhAMBAAAAAYUDAQAAAAGXAwEAAAABCQMAALAIACAHAACyCAAgCQAAsQgAIAoAALMIACALAAC0CAAgDAAAtQgAIIMDAgAAAAGFAwEAAAABhgMBAAAAAQIAAAAJACAbAACiCQAgAwAAAAkAIBsAAKIJACAcAAChCQAgARQAAOEKADAQAwAAvwUAIAQAAL4FACAHAAC4BQAgCQAAtwUAIAoAALkFACALAAC6BQAgDAAAuwUAIOsCAADLBQAw7AIAAAcAEO0CAADLBQAw8AIBAO0EACGDAwIA9AQAIYUDAQDuBAAhhgMBAO0EACGWAwEA7QQAIccDAADKBQAgAgAAAAkAIBQAAKEJACACAAAAnwkAIBQAAKAJACAI6wIAAJ4JADDsAgAAnwkAEO0CAACeCQAw8AIBAO0EACGDAwIA9AQAIYUDAQDuBAAhhgMBAO0EACGWAwEA7QQAIQjrAgAAngkAMOwCAACfCQAQ7QIAAJ4JADDwAgEA7QQAIYMDAgD0BAAhhQMBAO4EACGGAwEA7QQAIZYDAQDtBAAhA4MDAgDWBQAhhQMBAOUFACGGAwEA1QUAIQkDAADwBwAgBwAA8gcAIAkAAPEHACAKAADzBwAgCwAA9AcAIAwAAPUHACCDAwIA1gUAIYUDAQDlBQAhhgMBANUFACEJAwAAsAgAIAcAALIIACAJAACxCAAgCgAAswgAIAsAALQIACAMAAC1CAAggwMCAAAAAYUDAQAAAAGGAwEAAAABAxsAAN8KACDOAwAA4AoAINQDAAABACAEGwAAlwkAMM4DAACYCQAw0AMAAJoJACDUAwAAmwkAMAQbAACOCQAwzgMAAI8JADDQAwAAkQkAINQDAACnCAAwBBsAAIUJADDOAwAAhgkAMNADAACICQAg1AMAAKYHADAEGwAA_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_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_BQAgBwAAuAUAIAkAALcFACAKAAC5BQAgCwAAugUAIAwAALsFACANAAC2BQAg6wIAAM0FADDsAgAAAwAQ7QIAAM0FADDuAgEA7QQAIYUDAQDuBAAhhwMCAPQEACGIAwIA9AQAIYkDAQDtBAAhlgMBAO0EACGjAwEA7QQAIaUDAQDuBAAhpgMgAM4FACHLAwAAzAUAIAIAAAAFACAUAADACgAgAgAAAL4KACAUAAC_CgAgDOsCAAC9CgAw7AIAAL4KABDtAgAAvQoAMO4CAQDtBAAhhQMBAO4EACGHAwIA9AQAIYgDAgD0BAAhiQMBAO0EACGWAwEA7QQAIaMDAQDtBAAhpQMBAO4EACGmAyAAzgUAIQzrAgAAvQoAMOwCAAC-CgAQ7QIAAL0KADDuAgEA7QQAIYUDAQDuBAAhhwMCAPQEACGIAwIA9AQAIYkDAQDtBAAhlgMBAO0EACGjAwEA7QQAIaUDAQDuBAAhpgMgAM4FACEI7gIBANUFACGFAwEA5QUAIYcDAgDWBQAhiAMCANYFACGJAwEA1QUAIaMDAQDVBQAhpQMBAOUFACGmAyAA4ggAIQ4HAADmCAAgCQAA5QgAIAoAAOcIACALAADoCAAgDAAA6QgAIA0AAOQIACDuAgEA1QUAIYUDAQDlBQAhhwMCANYFACGIAwIA1gUAIYkDAQDVBQAhowMBANUFACGlAwEA5QUAIaYDIADiCAAhDgcAAKYJACAJAAClCQAgCgAApwkAIAsAAKgJACAMAACpCQAgDQAApAkAIO4CAQAAAAGFAwEAAAABhwMCAAAAAYgDAgAAAAGJAwEAAAABowMBAAAAAaUDAQAAAAGmAyAAAAABBBsAALYKADDOAwAAtwoAMNADAAC5CgAg1AMAALoKADAEGwAArQoAMM4DAACuCgAw0AMAALAKACDUAwAAmwkAMAQbAACkCgAwzgMAAKUKADDQAwAApwoAINQDAACnCAAwBBsAAJsKADDOAwAAnAoAMNADAACeCgAg1AMAAKYHADAEGwAAkgoAMM4DAACTCgAw0AMAAJUKACDUAwAAkggAMAQbAACJCgAwzgMAAIoKADDQAwAAjAoAINQDAACGCAAwBBsAAIAKADDOAwAAgQoAMNADAACDCgAg1AMAAPoHADAAAAAAAAAACgMAANEKACAHAADMCgAgCQAAywoAIAoAAM0KACALAADOCgAgDAAAzwoAIA0AAMoKACCFAwAAzwUAIKUDAADPBQAgpgMAAM8FACALBwAAzAoAIAkAAMsKACAKAADNCgAgCwAAzgoAIAwAAM8KACANAADKCgAgDgAAyQoAIIUDAADPBQAgjAMAAM8FACDCAwAAzwUAIMYDAADPBQAgCAMAANEKACAEAADQCgAgBwAAzAoAIAkAAMsKACAKAADNCgAgCwAAzgoAIAwAAM8KACCFAwAAzwUAIAUDAADRCgAgBAAA0AoAIAUAANIKACAHAADMCgAghQMAAM8FACAI7gIBAAAAAYUDAQAAAAGHAwIAAAABiAMCAAAAAYkDAQAAAAGjAwEAAAABpQMBAAAAAaYDIAAAAAEE8AIBAAAAAYMDAgAAAAGFAwEAAAABhgMBAAAAAQbwAgEAAAAB8QICAAAAAYMDAgAAAAGEAwEAAAABhQMBAAAAAZcDAQAAAAEG7gICAAAAAfACAQAAAAHxAgIAAAAB8gICAAAAAYUDAQAAAAGXAwEAAAABBPACAQAAAAGDAwIAAAABmgMBAAAAAZwDAQAAAAEE8AIBAAAAAYMDAgAAAAGaAwEAAAABmwMBAAAAAQPwAgEAAAABgwMCAAAAAZkDAQAAAAEI7gIBAAAAAYUDAQAAAAGHAwIAAAABiAMCAAAAAYkDAQAAAAGdAwEAAAABowMBAAAAAaQDAQAAAAEF8AIBAAAAAYMDAgAAAAGFAwEAAAABhgMBAAAAAZ0DAQAAAAEG8AIBAAAAAfECAgAAAAGDAwIAAAABhAMBAAAAAYUDAQAAAAGXAwEAAAABCu4CAQAAAAH0AgIAAAAB9QICAAAAAYUDAQAAAAGGAwEAAAABngMBAAAAAZ8DAQAAAAGgAwEAAAABoQMCAAAAAaIDAgAAAAERBwAAxQoAIAkAAMQKACAKAADGCgAgCwAAxwoAIAwAAMgKACANAADDCgAg7gIBAAAAAYUDAQAAAAGJAwEAAAABigMBAAAAAYsDAQAAAAGMAwEAAAABjQMBAAAAAY4DAQAAAAGPAwEAAAABwgMBAAAAAcYDAQAAAAECAAAAAQAgGwAA3woAIAODAwIAAAABhQMBAAAAAYYDAQAAAAEF8QICAAAAAYMDAgAAAAGEAwEAAAABhQMBAAAAAZcDAQAAAAEF7gICAAAAAfECAgAAAAHyAgIAAAABhQMBAAAAAZcDAQAAAAEDgwMCAAAAAZoDAQAAAAGcAwEAAAABA4MDAgAAAAGaAwEAAAABmwMBAAAAAQKDAwIAAAABmQMBAAAAAQMAAABAACAbAADfCgAgHAAA6QoAIBMAAABAACAHAAD8CQAgCQAA-wkAIAoAAP0JACALAAD-CQAgDAAA_wkAIA0AAPoJACAUAADpCgAg7gIBANUFACGFAwEA5QUAIYkDAQDVBQAhigMBANUFACGLAwEA1QUAIYwDAQDlBQAhjQMBANUFACGOAwEA1QUAIY8DAQDVBQAhwgMBAOUFACHGAwEA5QUAIREHAAD8CQAgCQAA-wkAIAoAAP0JACALAAD-CQAgDAAA_wkAIA0AAPoJACDuAgEA1QUAIYUDAQDlBQAhiQMBANUFACGKAwEA1QUAIYsDAQDVBQAhjAMBAOUFACGNAwEA1QUAIY4DAQDVBQAhjwMBANUFACHCAwEA5QUAIcYDAQDlBQAhDQkAAO0JACANAADsCQAgJgAA7gkAIO4CAQAAAAGFAwEAAAABiQMBAAAAAYoDAQAAAAGLAwEAAAABjAMBAAAAAY0DAQAAAAGOAwEAAAABjwMBAAAAAcIDAQAAAAECAAAAVgAgGwAA6goAIASDAwIAAAABhQMBAAAAAYYDAQAAAAGdAwEAAAABBfECAgAAAAGDAwIAAAABhAMBAAAAAYUDAQAAAAGXAwEAAAABAwAAAHMAIBsAAOoKACAcAADwCgAgDwAAAHMAIAkAAL8JACANAAC-CQAgFAAA8AoAICYAAMAJACDuAgEA1QUAIYUDAQDlBQAhiQMBANUFACGKAwEA1QUAIYsDAQDVBQAhjAMBAOUFACGNAwEA1QUAIY4DAQDVBQAhjwMBANUFACHCAwEA5QUAIQ0JAAC_CQAgDQAAvgkAICYAAMAJACDuAgEA1QUAIYUDAQDlBQAhiQMBANUFACGKAwEA1QUAIYsDAQDVBQAhjAMBAOUFACGNAwEA1QUAIY4DAQDVBQAhjwMBANUFACHCAwEA5QUAIQ0JAADtCQAgDQAA7AkAIA4AAOsJACDuAgEAAAABhQMBAAAAAYkDAQAAAAGKAwEAAAABiwMBAAAAAYwDAQAAAAGNAwEAAAABjgMBAAAAAY8DAQAAAAHCAwEAAAABAgAAAFYAIBsAAPEKACADAAAAcwAgGwAA8QoAIBwAAPUKACAPAAAAcwAgCQAAvwkAIA0AAL4JACAOAAC9CQAgFAAA9QoAIO4CAQDVBQAhhQMBAOUFACGJAwEA1QUAIYoDAQDVBQAhiwMBANUFACGMAwEA5QUAIY0DAQDVBQAhjgMBANUFACGPAwEA1QUAIcIDAQDlBQAhDQkAAL8JACANAAC-CQAgDgAAvQkAIO4CAQDVBQAhhQMBAOUFACGJAwEA1QUAIYoDAQDVBQAhiwMBANUFACGMAwEA5QUAIY0DAQDVBQAhjgMBANUFACGPAwEA1QUAIcIDAQDlBQAhEQcAAMUKACAJAADECgAgCgAAxgoAIAsAAMcKACAMAADICgAgDgAAwgoAIO4CAQAAAAGFAwEAAAABiQMBAAAAAYoDAQAAAAGLAwEAAAABjAMBAAAAAY0DAQAAAAGOAwEAAAABjwMBAAAAAcIDAQAAAAHGAwEAAAABAgAAAAEAIBsAAPYKACAPAwAAowkAIAcAAKYJACAJAAClCQAgCgAApwkAIAsAAKgJACAMAACpCQAg7gIBAAAAAYUDAQAAAAGHAwIAAAABiAMCAAAAAYkDAQAAAAGWAwEAAAABowMBAAAAAaUDAQAAAAGmAyAAAAABAgAAAAUAIBsAAPgKACAEgwMCAAAAAYQDAQAAAAGFAwEAAAABlwMBAAAAAQTuAgIAAAAB8gICAAAAAYUDAQAAAAGXAwEAAAABApoDAQAAAAGcAwEAAAABApoDAQAAAAGbAwEAAAABAZkDAQAAAAEDAAAAQAAgGwAA9goAIBwAAIELACATAAAAQAAgBwAA_AkAIAkAAPsJACAKAAD9CQAgCwAA_gkAIAwAAP8JACAOAAD5CQAgFAAAgQsAIO4CAQDVBQAhhQMBAOUFACGJAwEA1QUAIYoDAQDVBQAhiwMBANUFACGMAwEA5QUAIY0DAQDVBQAhjgMBANUFACGPAwEA1QUAIcIDAQDlBQAhxgMBAOUFACERBwAA_AkAIAkAAPsJACAKAAD9CQAgCwAA_gkAIAwAAP8JACAOAAD5CQAg7gIBANUFACGFAwEA5QUAIYkDAQDVBQAhigMBANUFACGLAwEA1QUAIYwDAQDlBQAhjQMBANUFACGOAwEA1QUAIY8DAQDVBQAhwgMBAOUFACHGAwEA5QUAIQMAAAADACAbAAD4CgAgHAAAhAsAIBEAAAADACADAADjCAAgBwAA5ggAIAkAAOUIACAKAADnCAAgCwAA6AgAIAwAAOkIACAUAACECwAg7gIBANUFACGFAwEA5QUAIYcDAgDWBQAhiAMCANYFACGJAwEA1QUAIZYDAQDVBQAhowMBANUFACGlAwEA5QUAIaYDIADiCAAhDwMAAOMIACAHAADmCAAgCQAA5QgAIAoAAOcIACALAADoCAAgDAAA6QgAIO4CAQDVBQAhhQMBAOUFACGHAwIA1gUAIYgDAgDWBQAhiQMBANUFACGWAwEA1QUAIaMDAQDVBQAhpQMBAOUFACGmAyAA4ggAIQ0JAADtCQAgDgAA6wkAICYAAO4JACDuAgEAAAABhQMBAAAAAYkDAQAAAAGKAwEAAAABiwMBAAAAAYwDAQAAAAGNAwEAAAABjgMBAAAAAY8DAQAAAAHCAwEAAAABAgAAAFYAIBsAAIULACALCQAA3AgAICUAANoIACDuAgEAAAABhQMBAAAAAYcDAgAAAAGIAwIAAAABiQMBAAAAAZgDAQAAAAGdAwEAAAABowMBAAAAAaQDAQAAAAECAAAAWgAgGwAAhwsAIASDAwIAAAABhAMBAAAAAYUDAQAAAAGXAwEAAAABAwAAAHMAIBsAAIULACAcAACMCwAgDwAAAHMAIAkAAL8JACAOAAC9CQAgFAAAjAsAICYAAMAJACDuAgEA1QUAIYUDAQDlBQAhiQMBANUFACGKAwEA1QUAIYsDAQDVBQAhjAMBAOUFACGNAwEA1QUAIY4DAQDVBQAhjwMBANUFACHCAwEA5QUAIQ0JAAC_CQAgDgAAvQkAICYAAMAJACDuAgEA1QUAIYUDAQDlBQAhiQMBANUFACGKAwEA1QUAIYsDAQDVBQAhjAMBAOUFACGNAwEA1QUAIY4DAQDVBQAhjwMBANUFACHCAwEA5QUAIQMAAABYACAbAACHCwAgHAAAjwsAIA0AAABYACAJAADECAAgFAAAjwsAICUAAMIIACDuAgEA1QUAIYUDAQDlBQAhhwMCANYFACGIAwIA1gUAIYkDAQDVBQAhmAMBANUFACGdAwEA5QUAIaMDAQDVBQAhpAMBAOUFACELCQAAxAgAICUAAMIIACDuAgEA1QUAIYUDAQDlBQAhhwMCANYFACGIAwIA1gUAIYkDAQDVBQAhmAMBANUFACGdAwEA5QUAIaMDAQDVBQAhpAMBAOUFACELAwAAsAgAIAQAAK8IACAHAACyCAAgCQAAsQgAIAsAALQIACAMAAC1CAAg8AIBAAAAAYMDAgAAAAGFAwEAAAABhgMBAAAAAZYDAQAAAAECAAAACQAgGwAAkAsAIBEHAADFCgAgCQAAxAoAIAsAAMcKACAMAADICgAgDQAAwwoAIA4AAMIKACDuAgEAAAABhQMBAAAAAYkDAQAAAAGKAwEAAAABiwMBAAAAAYwDAQAAAAGNAwEAAAABjgMBAAAAAY8DAQAAAAHCAwEAAAABxgMBAAAAAQIAAAABACAbAACSCwAgDwMAAKMJACAHAACmCQAgCQAApQkAIAsAAKgJACAMAACpCQAgDQAApAkAIO4CAQAAAAGFAwEAAAABhwMCAAAAAYgDAgAAAAGJAwEAAAABlgMBAAAAAaMDAQAAAAGlAwEAAAABpgMgAAAAAQIAAAAFACAbAACUCwAgAwAAAAcAIBsAAJALACAcAACYCwAgDQAAAAcAIAMAAPAHACAEAADvBwAgBwAA8gcAIAkAAPEHACALAAD0BwAgDAAA9QcAIBQAAJgLACDwAgEA1QUAIYMDAgDWBQAhhQMBAOUFACGGAwEA1QUAIZYDAQDVBQAhCwMAAPAHACAEAADvBwAgBwAA8gcAIAkAAPEHACALAAD0BwAgDAAA9QcAIPACAQDVBQAhgwMCANYFACGFAwEA5QUAIYYDAQDVBQAhlgMBANUFACEDAAAAQAAgGwAAkgsAIBwAAJsLACATAAAAQAAgBwAA_AkAIAkAAPsJACALAAD-CQAgDAAA_wkAIA0AAPoJACAOAAD5CQAgFAAAmwsAIO4CAQDVBQAhhQMBAOUFACGJAwEA1QUAIYoDAQDVBQAhiwMBANUFACGMAwEA5QUAIY0DAQDVBQAhjgMBANUFACGPAwEA1QUAIcIDAQDlBQAhxgMBAOUFACERBwAA_AkAIAkAAPsJACALAAD-CQAgDAAA_wkAIA0AAPoJACAOAAD5CQAg7gIBANUFACGFAwEA5QUAIYkDAQDVBQAhigMBANUFACGLAwEA1QUAIYwDAQDlBQAhjQMBANUFACGOAwEA1QUAIY8DAQDVBQAhwgMBAOUFACHGAwEA5QUAIQMAAAADACAbAACUCwAgHAAAngsAIBEAAAADACADAADjCAAgBwAA5ggAIAkAAOUIACALAADoCAAgDAAA6QgAIA0AAOQIACAUAACeCwAg7gIBANUFACGFAwEA5QUAIYcDAgDWBQAhiAMCANYFACGJAwEA1QUAIZYDAQDVBQAhowMBANUFACGlAwEA5QUAIaYDIADiCAAhDwMAAOMIACAHAADmCAAgCQAA5QgAIAsAAOgIACAMAADpCAAgDQAA5AgAIO4CAQDVBQAhhQMBAOUFACGHAwIA1gUAIYgDAgDWBQAhiQMBANUFACGWAwEA1QUAIaMDAQDVBQAhpQMBAOUFACGmAyAA4ggAIQsDAACwCAAgBAAArwgAIAcAALIIACAJAACxCAAgCgAAswgAIAwAALUIACDwAgEAAAABgwMCAAAAAYUDAQAAAAGGAwEAAAABlgMBAAAAAQIAAAAJACAbAACfCwAgEQcAAMUKACAJAADECgAgCgAAxgoAIAwAAMgKACANAADDCgAgDgAAwgoAIO4CAQAAAAGFAwEAAAABiQMBAAAAAYoDAQAAAAGLAwEAAAABjAMBAAAAAY0DAQAAAAGOAwEAAAABjwMBAAAAAcIDAQAAAAHGAwEAAAABAgAAAAEAIBsAAKELACAPAwAAowkAIAcAAKYJACAJAAClCQAgCgAApwkAIAwAAKkJACANAACkCQAg7gIBAAAAAYUDAQAAAAGHAwIAAAABiAMCAAAAAYkDAQAAAAGWAwEAAAABowMBAAAAAaUDAQAAAAGmAyAAAAABAgAAAAUAIBsAAKMLACADAAAABwAgGwAAnwsAIBwAAKcLACANAAAABwAgAwAA8AcAIAQAAO8HACAHAADyBwAgCQAA8QcAIAoAAPMHACAMAAD1BwAgFAAApwsAIPACAQDVBQAhgwMCANYFACGFAwEA5QUAIYYDAQDVBQAhlgMBANUFACELAwAA8AcAIAQAAO8HACAHAADyBwAgCQAA8QcAIAoAAPMHACAMAAD1BwAg8AIBANUFACGDAwIA1gUAIYUDAQDlBQAhhgMBANUFACGWAwEA1QUAIQMAAABAACAbAAChCwAgHAAAqgsAIBMAAABAACAHAAD8CQAgCQAA-wkAIAoAAP0JACAMAAD_CQAgDQAA-gkAIA4AAPkJACAUAACqCwAg7gIBANUFACGFAwEA5QUAIYkDAQDVBQAhigMBANUFACGLAwEA1QUAIYwDAQDlBQAhjQMBANUFACGOAwEA1QUAIY8DAQDVBQAhwgMBAOUFACHGAwEA5QUAIREHAAD8CQAgCQAA-wkAIAoAAP0JACAMAAD_CQAgDQAA-gkAIA4AAPkJACDuAgEA1QUAIYUDAQDlBQAhiQMBANUFACGKAwEA1QUAIYsDAQDVBQAhjAMBAOUFACGNAwEA1QUAIY4DAQDVBQAhjwMBANUFACHCAwEA5QUAIcYDAQDlBQAhAwAAAAMAIBsAAKMLACAcAACtCwAgEQAAAAMAIAMAAOMIACAHAADmCAAgCQAA5QgAIAoAAOcIACAMAADpCAAgDQAA5AgAIBQAAK0LACDuAgEA1QUAIYUDAQDlBQAhhwMCANYFACGIAwIA1gUAIYkDAQDVBQAhlgMBANUFACGjAwEA1QUAIaUDAQDlBQAhpgMgAOIIACEPAwAA4wgAIAcAAOYIACAJAADlCAAgCgAA5wgAIAwAAOkIACANAADkCAAg7gIBANUFACGFAwEA5QUAIYcDAgDWBQAhiAMCANYFACGJAwEA1QUAIZYDAQDVBQAhowMBANUFACGlAwEA5QUAIaYDIADiCAAhCwMAALAIACAEAACvCAAgBwAAsggAIAkAALEIACAKAACzCAAgCwAAtAgAIPACAQAAAAGDAwIAAAABhQMBAAAAAYYDAQAAAAGWAwEAAAABAgAAAAkAIBsAAK4LACARBwAAxQoAIAkAAMQKACAKAADGCgAgCwAAxwoAIA0AAMMKACAOAADCCgAg7gIBAAAAAYUDAQAAAAGJAwEAAAABigMBAAAAAYsDAQAAAAGMAwEAAAABjQMBAAAAAY4DAQAAAAGPAwEAAAABwgMBAAAAAcYDAQAAAAECAAAAAQAgGwAAsAsAIA8DAACjCQAgBwAApgkAIAkAAKUJACAKAACnCQAgCwAAqAkAIA0AAKQJACDuAgEAAAABhQMBAAAAAYcDAgAAAAGIAwIAAAABiQMBAAAAAZYDAQAAAAGjAwEAAAABpQMBAAAAAaYDIAAAAAECAAAABQAgGwAAsgsAIAMAAAAHACAbAACuCwAgHAAAtgsAIA0AAAAHACADAADwBwAgBAAA7wcAIAcAAPIHACAJAADxBwAgCgAA8wcAIAsAAPQHACAUAAC2CwAg8AIBANUFACGDAwIA1gUAIYUDAQDlBQAhhgMBANUFACGWAwEA1QUAIQsDAADwBwAgBAAA7wcAIAcAAPIHACAJAADxBwAgCgAA8wcAIAsAAPQHACDwAgEA1QUAIYMDAgDWBQAhhQMBAOUFACGGAwEA1QUAIZYDAQDVBQAhAwAAAEAAIBsAALALACAcAAC5CwAgEwAAAEAAIAcAAPwJACAJAAD7CQAgCgAA_QkAIAsAAP4JACANAAD6CQAgDgAA-QkAIBQAALkLACDuAgEA1QUAIYUDAQDlBQAhiQMBANUFACGKAwEA1QUAIYsDAQDVBQAhjAMBAOUFACGNAwEA1QUAIY4DAQDVBQAhjwMBANUFACHCAwEA5QUAIcYDAQDlBQAhEQcAAPwJACAJAAD7CQAgCgAA_QkAIAsAAP4JACANAAD6CQAgDgAA-QkAIO4CAQDVBQAhhQMBAOUFACGJAwEA1QUAIYoDAQDVBQAhiwMBANUFACGMAwEA5QUAIY0DAQDVBQAhjgMBANUFACGPAwEA1QUAIcIDAQDlBQAhxgMBAOUFACEDAAAAAwAgGwAAsgsAIBwAALwLACARAAAAAwAgAwAA4wgAIAcAAOYIACAJAADlCAAgCgAA5wgAIAsAAOgIACANAADkCAAgFAAAvAsAIO4CAQDVBQAhhQMBAOUFACGHAwIA1gUAIYgDAgDWBQAhiQMBANUFACGWAwEA1QUAIaMDAQDVBQAhpQMBAOUFACGmAyAA4ggAIQ8DAADjCAAgBwAA5ggAIAkAAOUIACAKAADnCAAgCwAA6AgAIA0AAOQIACDuAgEA1QUAIYUDAQDlBQAhhwMCANYFACGIAwIA1gUAIYkDAQDVBQAhlgMBANUFACGjAwEA1QUAIaUDAQDlBQAhpgMgAOIIACERBwAAxQoAIAoAAMYKACALAADHCgAgDAAAyAoAIA0AAMMKACAOAADCCgAg7gIBAAAAAYUDAQAAAAGJAwEAAAABigMBAAAAAYsDAQAAAAGMAwEAAAABjQMBAAAAAY4DAQAAAAGPAwEAAAABwgMBAAAAAcYDAQAAAAECAAAAAQAgGwAAvQsAIA8DAACjCQAgBwAApgkAIAoAAKcJACALAACoCQAgDAAAqQkAIA0AAKQJACDuAgEAAAABhQMBAAAAAYcDAgAAAAGIAwIAAAABiQMBAAAAAZYDAQAAAAGjAwEAAAABpQMBAAAAAaYDIAAAAAECAAAABQAgGwAAvwsAIAsDAACwCAAgBAAArwgAIAcAALIIACAKAACzCAAgCwAAtAgAIAwAALUIACDwAgEAAAABgwMCAAAAAYUDAQAAAAGGAwEAAAABlgMBAAAAAQIAAAAJACAbAADBCwAgA-4CAgAAAAGFAwEAAAABlwMBAAAAAQMAAABAACAbAAC9CwAgHAAAxgsAIBMAAABAACAHAAD8CQAgCgAA_QkAIAsAAP4JACAMAAD_CQAgDQAA-gkAIA4AAPkJACAUAADGCwAg7gIBANUFACGFAwEA5QUAIYkDAQDVBQAhigMBANUFACGLAwEA1QUAIYwDAQDlBQAhjQMBANUFACGOAwEA1QUAIY8DAQDVBQAhwgMBAOUFACHGAwEA5QUAIREHAAD8CQAgCgAA_QkAIAsAAP4JACAMAAD_CQAgDQAA-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_QkAIAsAAP4JACAMAAD_CQAgDQAA-gkAIA4AAPkJACAUAADpCwAg7gIBANUFACGFAwEA5QUAIYkDAQDVBQAhigMBANUFACGLAwEA1QUAIYwDAQDlBQAhjQMBANUFACGOAwEA1QUAIY8DAQDVBQAhwgMBAOUFACHGAwEA5QUAIREJAAD7CQAgCgAA_QkAIAsAAP4JACAMAAD_CQAgDQAA-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_wUAIBQAAJcMACCZAgAAgAYAIJoCAACCBgAg7wIBANUFACHwAgEA1QUAIYMDAgDWBQAhhQMBAOUFACGGAwEA1QUAIQgEAAD_BQAgmQIAAIAGACCaAgAAggYAIO8CAQDVBQAh8AIBANUFACGDAwIA1gUAIYUDAQDlBQAhhgMBANUFACEJBAAA9wUAIAUAAPYFACCZAgAA-AUAIO8CAQAAAAHwAgEAAAAB8QICAAAAAYMDAgAAAAGEAwEAAAABhQMBAAAAAQIAAADUAwAgGwAAmAwAIAgEAACYBgAgCQAAmgYAIJkCAACZBgAg7wIBAAAAAfACAQAAAAGDAwIAAAABhQMBAAAAAYYDAQAAAAECAAAA0AMAIBsAAJoMACAICQAAxQYAIA0AAMQGACCZAgAAwwYAIO4CAQAAAAHvAgEAAAABhQMBAAAAAYcDAgAAAAGIAwIAAAABAgAAAMwDACAbAACcDAAgDAkAAPcGACANAAD2BgAgDgAA9QYAIO4CAQAAAAGFAwEAAAABiQMBAAAAAYoDAQAAAAGLAwEAAAABjAMBAAAAAY0DAQAAAAGOAwEAAAABjwMBAAAAAQIAAADIAwAgGwAAngwAIAMAAADSAwAgGwAAmAwAIBwAAKIMACALAAAA0gMAIAQAAOcFACAFAADmBQAgFAAAogwAIJkCAADoBQAg7wIBANUFACHwAgEA1QUAIfECAgDWBQAhgwMCANYFACGEAwEA1QUAIYUDAQDlBQAhCQQAAOcFACAFAADmBQAgmQIAAOgFACDvAgEA1QUAIfACAQDVBQAh8QICANYFACGDAwIA1gUAIYQDAQDVBQAhhQMBAOUFACEDAAAAzgMAIBsAAJoMACAcAAClDAAgCgAAAM4DACAEAAD_BQAgCQAAgQYAIBQAAKUMACCZAgAAgAYAIO8CAQDVBQAh8AIBANUFACGDAwIA1gUAIYUDAQDlBQAhhgMBANUFACEIBAAA_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_ASEAwgEiAMMBRQDAAUYAwQEAAAAAAAUIAL8BIQDCASIAwwFFAMABRgDBAQMEAKQBBQClAZkCAKMBAwQApAEFAKUBmQIAowEFCADIASEAywEiAMwBRQDJAUYAygEAAAAAAAUIAMgBIQDLASIAzAFFAMkBRgDKAQQEAKQBBQClAQYApgGZAgCjAQQEAKQBBQClAQYApgGZAgCjAQUIANEBIQDUASIA1QFFANIBRgDTAQAAAAAABQgA0QEhANQBIgDVAUUA0gFGANMBDwIBED8BEUIBEkMBE0QBFUYBFkgNF0kOGEsBGU0NGk4PHU8BHlABH1ENI1QQJFUUJ1cVKHIVKXUVKnYVK3cVLHkVLXsNLnwdL34VMIABDTGBAR4yggEVM4MBFTSEAQ01hwEfNogBIzeKASQ4iwEkOY4BJDqPASQ7kAEkPJIBJD2UAQ0-lQElP5cBJECZAQ1BmgEmQpsBJEOcASREnQENR6ABJ0ihAS1JowEuSqQBLkunAS5MqAEuTakBLk6rAS5PrQENUK4BL1GwAS5SsgENU7MBMFS0AS5VtQEuVrYBDVe5ATFYugE3WbwBOFq9AThbwAE4XMEBOF3CAThexAE4X8YBDWDHATlhyQE4YssBDWPMATpkzQE4Zc4BOGbPAQ1n0gE7aNMBP2nUAQJq1QECa9YBAmzXAQJt2AECbtoBAm_cAQ1w3QFAcd8BAnLhAQ1z4gFBdOMBAnXkAQJ25QENd-gBQnjpAUh56gEWeusBFnvsARZ87QEWfe4BFn7wARZ_8gENgAHzAUmBAfUBFoIB9wENgwH4AUqEAfkBFoUB-gEWhgH7AQ2HAf4BS4gB_wFRiQGAAhuKAYECG4sBggIbjAGDAhuNAYQCG44BhgIbjwGIAg2QAYkCUpEBiwIbkgGNAg2TAY4CU5QBjwIblQGQAhuWAZECDZcBlAJUmAGVAlqZAZYCA5oBlwIDmwGYAgOcAZkCA50BmgIDngGcAgOfAZ4CDaABnwJboQGhAgOiAaMCDaMBpAJcpAGlAgOlAaYCA6YBpwINpwGqAl2oAasCY6kBrAIXqgGtAherAa4CF6wBrwIXrQGwAheuAbICF68BtAINsAG1AmSxAbcCF7IBuQINswG6AmW0AbsCF7UBvAIXtgG9Ag23AcACZrgBwQJsuQHCAge6AcMCB7sBxAIHvAHFAge9AcYCB74ByAIHvwHKAg3AAcsCbcEBzQIHwgHPAg3DAdACbsQB0QIHxQHSAgfGAdMCDccB1gJvyAHXAnXJAdgCCMoB2QIIywHaAgjMAdsCCM0B3AIIzgHeAgjPAeACDdAB4QJ20QHjAgjSAeUCDdMB5gJ31AHnAgjVAegCCNYB6QIN1wHsAnjYAe0CftkB7gIJ2gHvAgnbAfACCdwB8QIJ3QHyAgneAfQCCd8B9gIN4AH3An_hAfkCCeIB-wIN4wH8AoAB5AH9AgnlAf4CCeYB_wIN5wGCA4EB6AGDA4cB6QGEAwTqAYUDBOsBhgME7AGHAwTtAYgDBO4BigME7wGMAw3wAY0DiAHxAY8DBPIBkQMN8wGSA4kB9AGTAwT1AZQDBPYBlQMN9wGYA4oB-AGZA5AB-QGaAxj6AZsDGPsBnAMY_AGdAxj9AZ4DGP4BoAMY_wGiAw2AAqMDkQGBAqUDGIICpwMNgwKoA5IBhAKpAxiFAqoDGIYCqwMNhwKuA5MBiAKvA5kBiQKwAwWKArEDBYsCsgMFjAKzAwWNArQDBY4CtgMFjwK4Aw2QArkDmgGRArwDBZICvgMNkwK_A5sBlALBAwWVAsIDBZYCwwMNlwLGA5wBmALHA6IBmwLJA6MBnALqA6MBnQLtA6MBngLuA6MBnwLvA6MBoALxA6MBoQLzAw2iAvQDrAGjAvYDowGkAvgDDaUC-QOtAaYC-gOjAacC-wOjAagC_AMNqQL_A64BqgKABLIBqwKBBKQBrAKCBKQBrQKDBKQBrgKEBKQBrwKFBKQBsAKHBKQBsQKJBA2yAooEswGzAowEpAG0Ao4EDbUCjwS0AbYCkASkAbcCkQSkAbgCkgQNuQKVBLUBugKWBLsBuwKXBKUBvAKYBKUBvQKZBKUBvgKaBKUBvwKbBKUBwAKdBKUBwQKfBA3CAqAEvAHDAqIEpQHEAqQEDcUCpQS9AcYCpgSlAccCpwSlAcgCqAQNyQKrBL4BygKsBMQBywKtBKYBzAKuBKYBzQKvBKYBzgKwBKYBzwKxBKYB0AKzBKYB0QK1BA3SArYExQHTArgEpgHUAroEDdUCuwTGAdYCvASmAdcCvQSmAdgCvgQN2QLBBMcB2gLCBM0B2wLDBKcB3ALEBKcB3QLFBKcB3gLGBKcB3wLHBKcB4ALJBKcB4QLLBA3iAswEzgHjAs4EpwHkAtAEDeUC0QTPAeYC0gSnAecC0wSnAegC1AQN6QLXBNAB6gLYBNYB\"\n}\n\nasync function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Module> {\n const { Buffer } = await import('node:buffer')\n const wasmArray = Buffer.from(wasmBase64, 'base64')\n return new WebAssembly.Module(wasmArray)\n}\n\nconfig.compilerWasm = {\n getRuntime: async () => await import(\"@prisma/client/runtime/query_compiler_fast_bg.sqlite.mjs\"),\n\n getQueryCompilerWasmModule: async () => {\n const { wasm } = await import(\"@prisma/client/runtime/query_compiler_fast_bg.sqlite.wasm-base64.mjs\")\n return await decodeBase64AsWasm(wasm)\n },\n\n importName: \"./query_compiler_fast_bg.js\"\n}\n\n\n\nexport type LogOptions<ClientOptions extends Prisma.PrismaClientOptions> =\n 'log' extends keyof ClientOptions ? ClientOptions['log'] extends Array<Prisma.LogLevel | Prisma.LogDefinition> ? Prisma.GetEvents<ClientOptions['log']> : never : never\n\nexport interface PrismaClientConstructor {\n /**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL })\n * })\n * // Fetch zero or more Translations\n * const translations = await prisma.translation.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\n new <\n Options extends Prisma.PrismaClientOptions = Prisma.PrismaClientOptions,\n LogOpts extends LogOptions<Options> = LogOptions<Options>,\n OmitOpts extends Prisma.PrismaClientOptions['omit'] = Options extends { omit: infer U } ? U : Prisma.PrismaClientOptions['omit'],\n ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n >(options: Prisma.Subset<Options, Prisma.PrismaClientOptions> ): PrismaClient<LogOpts, OmitOpts, ExtArgs>\n}\n\n/**\n * ## Prisma Client\n * \n * Type-safe database client for TypeScript\n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL })\n * })\n * // Fetch zero or more Translations\n * const translations = await prisma.translation.findMany()\n * ```\n * \n * Read more in our [docs](https://pris.ly/d/client).\n */\n\nexport interface PrismaClient<\n in LogOpts extends Prisma.LogLevel = never,\n in out OmitOpts extends Prisma.PrismaClientOptions['omit'] = undefined,\n in out ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs\n> {\n [K: symbol]: { types: Prisma.TypeMap<ExtArgs>['other'] }\n\n $on<V extends LogOpts>(eventType: V, callback: (event: V extends 'query' ? Prisma.QueryEvent : Prisma.LogEvent) => void): PrismaClient;\n\n /**\n * Connect with the database\n */\n $connect(): runtime.Types.Utils.JsPromise<void>;\n\n /**\n * Disconnect from the database\n */\n $disconnect(): runtime.Types.Utils.JsPromise<void>;\n\n/**\n * Executes a prepared raw query and returns the number of affected rows.\n * @example\n * ```\n * const result = await prisma.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Executes a raw query and returns the number of affected rows.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$executeRawUnsafe('UPDATE User SET cool = $1 WHERE email = $2 ;', true, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $executeRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<number>;\n\n /**\n * Performs a prepared raw query and returns the `SELECT` data.\n * @example\n * ```\n * const result = await prisma.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRaw<T = unknown>(query: TemplateStringsArray | Prisma.Sql, ...values: any[]): Prisma.PrismaPromise<T>;\n\n /**\n * Performs a raw query and returns the `SELECT` data.\n * Susceptible to SQL injections, see documentation.\n * @example\n * ```\n * const result = await prisma.$queryRawUnsafe('SELECT * FROM User WHERE id = $1 OR email = $2;', 1, 'user@email.com')\n * ```\n *\n * Read more in our [docs](https://pris.ly/d/raw-queries).\n */\n $queryRawUnsafe<T = unknown>(query: string, ...values: any[]): Prisma.PrismaPromise<T>;\n\n\n /**\n * Allows the running of a sequence of read/write operations that are guaranteed to either succeed or fail as a whole.\n * @example\n * ```\n * const [george, bob, alice] = await prisma.$transaction([\n * prisma.user.create({ data: { name: 'George' } }),\n * prisma.user.create({ data: { name: 'Bob' } }),\n * prisma.user.create({ data: { name: 'Alice' } }),\n * ])\n * ```\n * \n * Read more in our [docs](https://www.prisma.io/docs/orm/prisma-client/queries/transactions).\n */\n $transaction<P extends Prisma.PrismaPromise<any>[]>(arg: [...P], options?: { maxWait?: number, timeout?: number, isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<runtime.Types.Utils.UnwrapTuple<P>>\n\n $transaction<R>(fn: (prisma: Omit<PrismaClient, runtime.ITXClientDenyList>) => runtime.Types.Utils.JsPromise<R>, options?: { maxWait?: number, timeout?: number, isolationLevel?: Prisma.TransactionIsolationLevel }): runtime.Types.Utils.JsPromise<R>\n\n $extends: runtime.Types.Extensions.ExtendsHook<\"extends\", Prisma.TypeMapCb<OmitOpts>, ExtArgs, runtime.Types.Utils.Call<Prisma.TypeMapCb<OmitOpts>, {\n extArgs: ExtArgs\n }>>\n\n /**\n * `prisma.translation`: Exposes CRUD operations for the **Translation** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Translations\n * const translations = await prisma.translation.findMany()\n * ```\n */\n get translation(): Prisma.TranslationDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.commentary`: Exposes CRUD operations for the **Commentary** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Commentaries\n * const commentaries = await prisma.commentary.findMany()\n * ```\n */\n get commentary(): Prisma.CommentaryDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.eBibleSource`: Exposes CRUD operations for the **EBibleSource** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more EBibleSources\n * const eBibleSources = await prisma.eBibleSource.findMany()\n * ```\n */\n get eBibleSource(): Prisma.EBibleSourceDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.inputFile`: Exposes CRUD operations for the **InputFile** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more InputFiles\n * const inputFiles = await prisma.inputFile.findMany()\n * ```\n */\n get inputFile(): Prisma.InputFileDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.inputFileWarning`: Exposes CRUD operations for the **InputFileWarning** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more InputFileWarnings\n * const inputFileWarnings = await prisma.inputFileWarning.findMany()\n * ```\n */\n get inputFileWarning(): Prisma.InputFileWarningDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.book`: Exposes CRUD operations for the **Book** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Books\n * const books = await prisma.book.findMany()\n * ```\n */\n get book(): Prisma.BookDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.commentaryBook`: Exposes CRUD operations for the **CommentaryBook** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more CommentaryBooks\n * const commentaryBooks = await prisma.commentaryBook.findMany()\n * ```\n */\n get commentaryBook(): Prisma.CommentaryBookDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.commentaryProfile`: Exposes CRUD operations for the **CommentaryProfile** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more CommentaryProfiles\n * const commentaryProfiles = await prisma.commentaryProfile.findMany()\n * ```\n */\n get commentaryProfile(): Prisma.CommentaryProfileDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.chapter`: Exposes CRUD operations for the **Chapter** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Chapters\n * const chapters = await prisma.chapter.findMany()\n * ```\n */\n get chapter(): Prisma.ChapterDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.commentaryChapter`: Exposes CRUD operations for the **CommentaryChapter** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more CommentaryChapters\n * const commentaryChapters = await prisma.commentaryChapter.findMany()\n * ```\n */\n get commentaryChapter(): Prisma.CommentaryChapterDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.chapterAudioUrl`: Exposes CRUD operations for the **ChapterAudioUrl** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more ChapterAudioUrls\n * const chapterAudioUrls = await prisma.chapterAudioUrl.findMany()\n * ```\n */\n get chapterAudioUrl(): Prisma.ChapterAudioUrlDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.chapterAudioTiming`: Exposes CRUD operations for the **ChapterAudioTiming** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more ChapterAudioTimings\n * const chapterAudioTimings = await prisma.chapterAudioTiming.findMany()\n * ```\n */\n get chapterAudioTiming(): Prisma.ChapterAudioTimingDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.chapterWords`: Exposes CRUD operations for the **ChapterWords** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more ChapterWords\n * const chapterWords = await prisma.chapterWords.findMany()\n * ```\n */\n get chapterWords(): Prisma.ChapterWordsDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.chapterVerse`: Exposes CRUD operations for the **ChapterVerse** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more ChapterVerses\n * const chapterVerses = await prisma.chapterVerse.findMany()\n * ```\n */\n get chapterVerse(): Prisma.ChapterVerseDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.commentaryChapterVerse`: Exposes CRUD operations for the **CommentaryChapterVerse** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more CommentaryChapterVerses\n * const commentaryChapterVerses = await prisma.commentaryChapterVerse.findMany()\n * ```\n */\n get commentaryChapterVerse(): Prisma.CommentaryChapterVerseDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.chapterFootnote`: Exposes CRUD operations for the **ChapterFootnote** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more ChapterFootnotes\n * const chapterFootnotes = await prisma.chapterFootnote.findMany()\n * ```\n */\n get chapterFootnote(): Prisma.ChapterFootnoteDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.dataset`: Exposes CRUD operations for the **Dataset** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more Datasets\n * const datasets = await prisma.dataset.findMany()\n * ```\n */\n get dataset(): Prisma.DatasetDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.datasetBook`: Exposes CRUD operations for the **DatasetBook** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more DatasetBooks\n * const datasetBooks = await prisma.datasetBook.findMany()\n * ```\n */\n get datasetBook(): Prisma.DatasetBookDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.datasetChapter`: Exposes CRUD operations for the **DatasetChapter** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more DatasetChapters\n * const datasetChapters = await prisma.datasetChapter.findMany()\n * ```\n */\n get datasetChapter(): Prisma.DatasetChapterDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.datasetChapterVerse`: Exposes CRUD operations for the **DatasetChapterVerse** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more DatasetChapterVerses\n * const datasetChapterVerses = await prisma.datasetChapterVerse.findMany()\n * ```\n */\n get datasetChapterVerse(): Prisma.DatasetChapterVerseDelegate<ExtArgs, { omit: OmitOpts }>;\n\n /**\n * `prisma.datasetReference`: Exposes CRUD operations for the **DatasetReference** model.\n * Example usage:\n * ```ts\n * // Fetch zero or more DatasetReferences\n * const datasetReferences = await prisma.datasetReference.findMany()\n * ```\n */\n get datasetReference(): Prisma.DatasetReferenceDelegate<ExtArgs, { omit: OmitOpts }>;\n}\n\nexport function getPrismaClientClass(): PrismaClientConstructor {\n return runtime.getPrismaClient(config) as unknown as PrismaClientConstructor\n}\n", "\n/* !!! This is code generated by Prisma. Do not edit directly. !!! */\n/* eslint-disable */\n// biome-ignore-all lint: generated file\n// @ts-nocheck \n/*\n * WARNING: This is an internal file that is subject to change!\n *\n * \uD83D\uDED1 Under no circumstances should you import this file directly! \uD83D\uDED1\n *\n * All exports from this file are wrapped under a `Prisma` namespace object in the client.ts file.\n * While this enables partial backward compatibility, it is not part of the stable public API.\n *\n * If you are looking for your Models, Enums, and Input Types, please import them from the respective\n * model files in the `model` directory!\n */\n\nimport * as runtime from \"@prisma/client/runtime/client\"\nimport type * as Prisma from \"../models\"\nimport { type PrismaClient } from \"./class\"\n\nexport type * from '../models'\n\nexport type DMMF = typeof runtime.DMMF\n\nexport type PrismaPromise<T> = runtime.Types.Public.PrismaPromise<T>\n\n/**\n * Prisma Errors\n */\n\nexport const PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\nexport type PrismaClientKnownRequestError = runtime.PrismaClientKnownRequestError\n\nexport const PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\nexport type PrismaClientUnknownRequestError = runtime.PrismaClientUnknownRequestError\n\nexport const PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\nexport type PrismaClientRustPanicError = runtime.PrismaClientRustPanicError\n\nexport const PrismaClientInitializationError = runtime.PrismaClientInitializationError\nexport type PrismaClientInitializationError = runtime.PrismaClientInitializationError\n\nexport const PrismaClientValidationError = runtime.PrismaClientValidationError\nexport type PrismaClientValidationError = runtime.PrismaClientValidationError\n\n/**\n * Re-export of sql-template-tag\n */\nexport const sql = runtime.sqltag\nexport const empty = runtime.empty\nexport const join = runtime.join\nexport const raw = runtime.raw\nexport const Sql = runtime.Sql\nexport type Sql = runtime.Sql\n\n\n\n/**\n * Decimal.js\n */\nexport const Decimal = runtime.Decimal\nexport type Decimal = runtime.Decimal\n\nexport type DecimalJsLike = runtime.DecimalJsLike\n\n/**\n* Extensions\n*/\nexport type Extension = runtime.Types.Extensions.UserArgs\nexport const getExtensionContext = runtime.Extensions.getExtensionContext\nexport type Args<T, F extends runtime.Operation> = runtime.Types.Public.Args<T, F>\nexport type Payload<T, F extends runtime.Operation = never> = runtime.Types.Public.Payload<T, F>\nexport type Result<T, A, F extends runtime.Operation> = runtime.Types.Public.Result<T, A, F>\nexport type Exact<A, W> = runtime.Types.Public.Exact<A, W>\n\nexport type PrismaVersion = {\n client: string\n engine: string\n}\n\n/**\n * Prisma Client JS version: 7.8.0\n * Query Engine version: 3c6e192761c0362d496ed980de936e2f3cebcd3a\n */\nexport const prismaVersion: PrismaVersion = {\n client: \"7.8.0\",\n engine: \"3c6e192761c0362d496ed980de936e2f3cebcd3a\"\n}\n\n/**\n * Utility Types\n */\n\nexport type Bytes = runtime.Bytes\nexport type JsonObject = runtime.JsonObject\nexport type JsonArray = runtime.JsonArray\nexport type JsonValue = runtime.JsonValue\nexport type InputJsonObject = runtime.InputJsonObject\nexport type InputJsonArray = runtime.InputJsonArray\nexport type InputJsonValue = runtime.InputJsonValue\n\n\nexport const NullTypes = {\n DbNull: runtime.NullTypes.DbNull as (new (secret: never) => typeof runtime.DbNull),\n JsonNull: runtime.NullTypes.JsonNull as (new (secret: never) => typeof runtime.JsonNull),\n AnyNull: runtime.NullTypes.AnyNull as (new (secret: never) => typeof runtime.AnyNull),\n}\n/**\n * Helper for filtering JSON entries that have `null` on the database (empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const DbNull = runtime.DbNull\n\n/**\n * Helper for filtering JSON entries that have JSON `null` values (not empty on the db)\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const JsonNull = runtime.JsonNull\n\n/**\n * Helper for filtering JSON entries that are `Prisma.DbNull` or `Prisma.JsonNull`\n *\n * @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field\n */\nexport const AnyNull = runtime.AnyNull\n\n\ntype SelectAndInclude = {\n select: any\n include: any\n}\n\ntype SelectAndOmit = {\n select: any\n omit: any\n}\n\n/**\n * From T, pick a set of properties whose keys are in the union K\n */\ntype Prisma__Pick<T, K extends keyof T> = {\n [P in K]: T[P];\n};\n\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Subset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection\n */\nexport type Subset<T, U> = {\n [key in keyof T]: key extends keyof U ? T[key] : never;\n};\n\n/**\n * SelectSubset\n * @desc From `T` pick properties that exist in `U`. Simple version of Intersection.\n * Additionally, it validates, if both select and include are present. If the case, it errors.\n */\nexport type SelectSubset<T, U> = {\n [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n (T extends SelectAndInclude\n ? 'Please either choose `select` or `include`.'\n : T extends SelectAndOmit\n ? 'Please either choose `select` or `omit`.'\n : {})\n\n/**\n * Subset + Intersection\n * @desc From `T` pick properties that exist in `U` and intersect `K`\n */\nexport type SubsetIntersection<T, U, K> = {\n [key in keyof T]: key extends keyof U ? T[key] : never\n} &\n K\n\ntype Without<T, U> = { [P in Exclude<keyof T, keyof U>]?: never };\n\n/**\n * XOR is needed to have a real mutually exclusive union type\n * https://stackoverflow.com/questions/42123407/does-typescript-support-mutually-exclusive-types\n */\nexport type XOR<T, U> =\n T extends object ?\n U extends object ?\n (Without<T, U> & U) | (Without<U, T> & T)\n : U : T\n\n\n/**\n * Is T a Record?\n */\ntype IsObject<T extends any> = T extends Array<any>\n? False\n: T extends Date\n? False\n: T extends Uint8Array\n? False\n: T extends BigInt\n? False\n: T extends object\n? True\n: False\n\n\n/**\n * If it's T[], return T\n */\nexport type UnEnumerate<T extends unknown> = T extends Array<infer U> ? U : T\n\n/**\n * From ts-toolbelt\n */\n\ntype __Either<O extends object, K extends Key> = Omit<O, K> &\n {\n // Merge all but K\n [P in K]: Prisma__Pick<O, P & keyof O> // With K possibilities\n }[K]\n\ntype EitherStrict<O extends object, K extends Key> = Strict<__Either<O, K>>\n\ntype EitherLoose<O extends object, K extends Key> = ComputeRaw<__Either<O, K>>\n\ntype _Either<\n O extends object,\n K extends Key,\n strict extends Boolean\n> = {\n 1: EitherStrict<O, K>\n 0: EitherLoose<O, K>\n}[strict]\n\nexport type Either<\n O extends object,\n K extends Key,\n strict extends Boolean = 1\n> = O extends unknown ? _Either<O, K, strict> : never\n\nexport type Union = any\n\nexport type PatchUndefined<O extends object, O1 extends object> = {\n [K in keyof O]: O[K] extends undefined ? At<O1, K> : O[K]\n} & {}\n\n/** Helper Types for \"Merge\" **/\nexport type IntersectOf<U extends Union> = (\n U extends unknown ? (k: U) => void : never\n) extends (k: infer I) => void\n ? I\n : never\n\nexport type Overwrite<O extends object, O1 extends object> = {\n [K in keyof O]: K extends keyof O1 ? O1[K] : O[K];\n} & {};\n\ntype _Merge<U extends object> = IntersectOf<Overwrite<U, {\n [K in keyof U]-?: At<U, K>;\n}>>;\n\ntype Key = string | number | symbol;\ntype AtStrict<O extends object, K extends Key> = O[K & keyof O];\ntype AtLoose<O extends object, K extends Key> = O extends unknown ? AtStrict<O, K> : never;\nexport type At<O extends object, K extends Key, strict extends Boolean = 1> = {\n 1: AtStrict<O, K>;\n 0: AtLoose<O, K>;\n}[strict];\n\nexport type ComputeRaw<A extends any> = A extends Function ? A : {\n [K in keyof A]: A[K];\n} & {};\n\nexport type OptionalFlat<O> = {\n [K in keyof O]?: O[K];\n} & {};\n\ntype _Record<K extends keyof any, T> = {\n [P in K]: T;\n};\n\n// cause typescript not to expand types and preserve names\ntype NoExpand<T> = T extends unknown ? T : never;\n\n// this type assumes the passed object is entirely optional\nexport type AtLeast<O extends object, K extends string> = NoExpand<\n O extends unknown\n ? | (K extends keyof O ? { [P in K]: O[P] } & O : O)\n | {[P in keyof O as P extends K ? P : never]-?: O[P]} & O\n : never>;\n\ntype _Strict<U, _U = U> = U extends unknown ? U & OptionalFlat<_Record<Exclude<Keys<_U>, keyof U>, never>> : never;\n\nexport type Strict<U extends object> = ComputeRaw<_Strict<U>>;\n/** End Helper Types for \"Merge\" **/\n\nexport type Merge<U extends object> = ComputeRaw<_Merge<Strict<U>>>;\n\nexport type Boolean = True | False\n\nexport type True = 1\n\nexport type False = 0\n\nexport type Not<B extends Boolean> = {\n 0: 1\n 1: 0\n}[B]\n\nexport type Extends<A1 extends any, A2 extends any> = [A1] extends [never]\n ? 0 // anything `never` is false\n : A1 extends A2\n ? 1\n : 0\n\nexport type Has<U extends Union, U1 extends Union> = Not<\n Extends<Exclude<U1, U>, U1>\n>\n\nexport type Or<B1 extends Boolean, B2 extends Boolean> = {\n 0: {\n 0: 0\n 1: 1\n }\n 1: {\n 0: 1\n 1: 1\n }\n}[B1][B2]\n\nexport type Keys<U extends Union> = U extends unknown ? keyof U : never\n\nexport type GetScalarType<T, O> = O extends object ? {\n [P in keyof T]: P extends keyof O\n ? O[P]\n : never\n} : never\n\ntype FieldPaths<\n T,\n U = Omit<T, '_avg' | '_sum' | '_count' | '_min' | '_max'>\n> = IsObject<T> extends True ? U : T\n\nexport type GetHavingFields<T> = {\n [K in keyof T]: Or<\n Or<Extends<'OR', K>, Extends<'AND', K>>,\n Extends<'NOT', K>\n > extends True\n ? // infer is only needed to not hit TS limit\n // based on the brilliant idea of Pierre-Antoine Mills\n // https://github.com/microsoft/TypeScript/issues/30188#issuecomment-478938437\n T[K] extends infer TK\n ? GetHavingFields<UnEnumerate<TK> extends object ? Merge<UnEnumerate<TK>> : never>\n : never\n : {} extends FieldPaths<T[K]>\n ? never\n : K\n}[keyof T]\n\n/**\n * Convert tuple to union\n */\ntype _TupleToUnion<T> = T extends (infer E)[] ? E : never\ntype TupleToUnion<K extends readonly any[]> = _TupleToUnion<K>\nexport type MaybeTupleToUnion<T> = T extends any[] ? TupleToUnion<T> : T\n\n/**\n * Like `Pick`, but additionally can also accept an array of keys\n */\nexport type PickEnumerable<T, K extends Enumerable<keyof T> | keyof T> = Prisma__Pick<T, MaybeTupleToUnion<K>>\n\n/**\n * Exclude all keys with underscores\n */\nexport type ExcludeUnderscoreKeys<T extends string> = T extends `_${string}` ? never : T\n\n\nexport type FieldRef<Model, FieldType> = runtime.FieldRef<Model, FieldType>\n\ntype FieldRefInputType<Model, FieldType> = Model extends never ? never : FieldRef<Model, FieldType>\n\n\nexport const ModelName = {\n Translation: 'Translation',\n Commentary: 'Commentary',\n EBibleSource: 'EBibleSource',\n InputFile: 'InputFile',\n InputFileWarning: 'InputFileWarning',\n Book: 'Book',\n CommentaryBook: 'CommentaryBook',\n CommentaryProfile: 'CommentaryProfile',\n Chapter: 'Chapter',\n CommentaryChapter: 'CommentaryChapter',\n ChapterAudioUrl: 'ChapterAudioUrl',\n ChapterAudioTiming: 'ChapterAudioTiming',\n ChapterWords: 'ChapterWords',\n ChapterVerse: 'ChapterVerse',\n CommentaryChapterVerse: 'CommentaryChapterVerse',\n ChapterFootnote: 'ChapterFootnote',\n Dataset: 'Dataset',\n DatasetBook: 'DatasetBook',\n DatasetChapter: 'DatasetChapter',\n DatasetChapterVerse: 'DatasetChapterVerse',\n DatasetReference: 'DatasetReference'\n} as const\n\nexport type ModelName = (typeof ModelName)[keyof typeof ModelName]\n\n\n\nexport interface TypeMapCb<GlobalOmitOptions = {}> extends runtime.Types.Utils.Fn<{extArgs: runtime.Types.Extensions.InternalArgs }, runtime.Types.Utils.Record<string, any>> {\n returns: TypeMap<this['params']['extArgs'], GlobalOmitOptions>\n}\n\nexport type TypeMap<ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs, GlobalOmitOptions = {}> = {\n globalOmitOptions: {\n omit: GlobalOmitOptions\n }\n meta: {\n modelProps: \"translation\" | \"commentary\" | \"eBibleSource\" | \"inputFile\" | \"inputFileWarning\" | \"book\" | \"commentaryBook\" | \"commentaryProfile\" | \"chapter\" | \"commentaryChapter\" | \"chapterAudioUrl\" | \"chapterAudioTiming\" | \"chapterWords\" | \"chapterVerse\" | \"commentaryChapterVerse\" | \"chapterFootnote\" | \"dataset\" | \"datasetBook\" | \"datasetChapter\" | \"datasetChapterVerse\" | \"datasetReference\"\n txIsolationLevel: TransactionIsolationLevel\n }\n model: {\n Translation: {\n payload: Prisma.$TranslationPayload<ExtArgs>\n fields: Prisma.TranslationFieldRefs\n operations: {\n findUnique: {\n args: Prisma.TranslationFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TranslationPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.TranslationFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TranslationPayload>\n }\n findFirst: {\n args: Prisma.TranslationFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TranslationPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.TranslationFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TranslationPayload>\n }\n findMany: {\n args: Prisma.TranslationFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TranslationPayload>[]\n }\n create: {\n args: Prisma.TranslationCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TranslationPayload>\n }\n createMany: {\n args: Prisma.TranslationCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.TranslationCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TranslationPayload>[]\n }\n delete: {\n args: Prisma.TranslationDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TranslationPayload>\n }\n update: {\n args: Prisma.TranslationUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TranslationPayload>\n }\n deleteMany: {\n args: Prisma.TranslationDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.TranslationUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.TranslationUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TranslationPayload>[]\n }\n upsert: {\n args: Prisma.TranslationUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$TranslationPayload>\n }\n aggregate: {\n args: Prisma.TranslationAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateTranslation>\n }\n groupBy: {\n args: Prisma.TranslationGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.TranslationGroupByOutputType>[]\n }\n count: {\n args: Prisma.TranslationCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.TranslationCountAggregateOutputType> | number\n }\n }\n }\n Commentary: {\n payload: Prisma.$CommentaryPayload<ExtArgs>\n fields: Prisma.CommentaryFieldRefs\n operations: {\n findUnique: {\n args: Prisma.CommentaryFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.CommentaryFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryPayload>\n }\n findFirst: {\n args: Prisma.CommentaryFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.CommentaryFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryPayload>\n }\n findMany: {\n args: Prisma.CommentaryFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryPayload>[]\n }\n create: {\n args: Prisma.CommentaryCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryPayload>\n }\n createMany: {\n args: Prisma.CommentaryCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.CommentaryCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryPayload>[]\n }\n delete: {\n args: Prisma.CommentaryDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryPayload>\n }\n update: {\n args: Prisma.CommentaryUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryPayload>\n }\n deleteMany: {\n args: Prisma.CommentaryDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.CommentaryUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.CommentaryUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryPayload>[]\n }\n upsert: {\n args: Prisma.CommentaryUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryPayload>\n }\n aggregate: {\n args: Prisma.CommentaryAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateCommentary>\n }\n groupBy: {\n args: Prisma.CommentaryGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.CommentaryGroupByOutputType>[]\n }\n count: {\n args: Prisma.CommentaryCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.CommentaryCountAggregateOutputType> | number\n }\n }\n }\n EBibleSource: {\n payload: Prisma.$EBibleSourcePayload<ExtArgs>\n fields: Prisma.EBibleSourceFieldRefs\n operations: {\n findUnique: {\n args: Prisma.EBibleSourceFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EBibleSourcePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.EBibleSourceFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EBibleSourcePayload>\n }\n findFirst: {\n args: Prisma.EBibleSourceFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EBibleSourcePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.EBibleSourceFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EBibleSourcePayload>\n }\n findMany: {\n args: Prisma.EBibleSourceFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EBibleSourcePayload>[]\n }\n create: {\n args: Prisma.EBibleSourceCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EBibleSourcePayload>\n }\n createMany: {\n args: Prisma.EBibleSourceCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.EBibleSourceCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EBibleSourcePayload>[]\n }\n delete: {\n args: Prisma.EBibleSourceDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EBibleSourcePayload>\n }\n update: {\n args: Prisma.EBibleSourceUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EBibleSourcePayload>\n }\n deleteMany: {\n args: Prisma.EBibleSourceDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.EBibleSourceUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.EBibleSourceUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EBibleSourcePayload>[]\n }\n upsert: {\n args: Prisma.EBibleSourceUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$EBibleSourcePayload>\n }\n aggregate: {\n args: Prisma.EBibleSourceAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateEBibleSource>\n }\n groupBy: {\n args: Prisma.EBibleSourceGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.EBibleSourceGroupByOutputType>[]\n }\n count: {\n args: Prisma.EBibleSourceCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.EBibleSourceCountAggregateOutputType> | number\n }\n }\n }\n InputFile: {\n payload: Prisma.$InputFilePayload<ExtArgs>\n fields: Prisma.InputFileFieldRefs\n operations: {\n findUnique: {\n args: Prisma.InputFileFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFilePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.InputFileFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFilePayload>\n }\n findFirst: {\n args: Prisma.InputFileFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFilePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.InputFileFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFilePayload>\n }\n findMany: {\n args: Prisma.InputFileFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFilePayload>[]\n }\n create: {\n args: Prisma.InputFileCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFilePayload>\n }\n createMany: {\n args: Prisma.InputFileCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.InputFileCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFilePayload>[]\n }\n delete: {\n args: Prisma.InputFileDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFilePayload>\n }\n update: {\n args: Prisma.InputFileUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFilePayload>\n }\n deleteMany: {\n args: Prisma.InputFileDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.InputFileUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.InputFileUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFilePayload>[]\n }\n upsert: {\n args: Prisma.InputFileUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFilePayload>\n }\n aggregate: {\n args: Prisma.InputFileAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateInputFile>\n }\n groupBy: {\n args: Prisma.InputFileGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InputFileGroupByOutputType>[]\n }\n count: {\n args: Prisma.InputFileCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InputFileCountAggregateOutputType> | number\n }\n }\n }\n InputFileWarning: {\n payload: Prisma.$InputFileWarningPayload<ExtArgs>\n fields: Prisma.InputFileWarningFieldRefs\n operations: {\n findUnique: {\n args: Prisma.InputFileWarningFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFileWarningPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.InputFileWarningFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFileWarningPayload>\n }\n findFirst: {\n args: Prisma.InputFileWarningFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFileWarningPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.InputFileWarningFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFileWarningPayload>\n }\n findMany: {\n args: Prisma.InputFileWarningFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFileWarningPayload>[]\n }\n create: {\n args: Prisma.InputFileWarningCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFileWarningPayload>\n }\n createMany: {\n args: Prisma.InputFileWarningCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.InputFileWarningCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFileWarningPayload>[]\n }\n delete: {\n args: Prisma.InputFileWarningDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFileWarningPayload>\n }\n update: {\n args: Prisma.InputFileWarningUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFileWarningPayload>\n }\n deleteMany: {\n args: Prisma.InputFileWarningDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.InputFileWarningUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.InputFileWarningUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFileWarningPayload>[]\n }\n upsert: {\n args: Prisma.InputFileWarningUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$InputFileWarningPayload>\n }\n aggregate: {\n args: Prisma.InputFileWarningAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateInputFileWarning>\n }\n groupBy: {\n args: Prisma.InputFileWarningGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InputFileWarningGroupByOutputType>[]\n }\n count: {\n args: Prisma.InputFileWarningCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.InputFileWarningCountAggregateOutputType> | number\n }\n }\n }\n Book: {\n payload: Prisma.$BookPayload<ExtArgs>\n fields: Prisma.BookFieldRefs\n operations: {\n findUnique: {\n args: Prisma.BookFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BookPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.BookFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BookPayload>\n }\n findFirst: {\n args: Prisma.BookFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BookPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.BookFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BookPayload>\n }\n findMany: {\n args: Prisma.BookFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BookPayload>[]\n }\n create: {\n args: Prisma.BookCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BookPayload>\n }\n createMany: {\n args: Prisma.BookCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.BookCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BookPayload>[]\n }\n delete: {\n args: Prisma.BookDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BookPayload>\n }\n update: {\n args: Prisma.BookUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BookPayload>\n }\n deleteMany: {\n args: Prisma.BookDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.BookUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.BookUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BookPayload>[]\n }\n upsert: {\n args: Prisma.BookUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$BookPayload>\n }\n aggregate: {\n args: Prisma.BookAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateBook>\n }\n groupBy: {\n args: Prisma.BookGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.BookGroupByOutputType>[]\n }\n count: {\n args: Prisma.BookCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.BookCountAggregateOutputType> | number\n }\n }\n }\n CommentaryBook: {\n payload: Prisma.$CommentaryBookPayload<ExtArgs>\n fields: Prisma.CommentaryBookFieldRefs\n operations: {\n findUnique: {\n args: Prisma.CommentaryBookFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryBookPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.CommentaryBookFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryBookPayload>\n }\n findFirst: {\n args: Prisma.CommentaryBookFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryBookPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.CommentaryBookFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryBookPayload>\n }\n findMany: {\n args: Prisma.CommentaryBookFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryBookPayload>[]\n }\n create: {\n args: Prisma.CommentaryBookCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryBookPayload>\n }\n createMany: {\n args: Prisma.CommentaryBookCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.CommentaryBookCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryBookPayload>[]\n }\n delete: {\n args: Prisma.CommentaryBookDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryBookPayload>\n }\n update: {\n args: Prisma.CommentaryBookUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryBookPayload>\n }\n deleteMany: {\n args: Prisma.CommentaryBookDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.CommentaryBookUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.CommentaryBookUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryBookPayload>[]\n }\n upsert: {\n args: Prisma.CommentaryBookUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryBookPayload>\n }\n aggregate: {\n args: Prisma.CommentaryBookAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateCommentaryBook>\n }\n groupBy: {\n args: Prisma.CommentaryBookGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.CommentaryBookGroupByOutputType>[]\n }\n count: {\n args: Prisma.CommentaryBookCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.CommentaryBookCountAggregateOutputType> | number\n }\n }\n }\n CommentaryProfile: {\n payload: Prisma.$CommentaryProfilePayload<ExtArgs>\n fields: Prisma.CommentaryProfileFieldRefs\n operations: {\n findUnique: {\n args: Prisma.CommentaryProfileFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryProfilePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.CommentaryProfileFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryProfilePayload>\n }\n findFirst: {\n args: Prisma.CommentaryProfileFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryProfilePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.CommentaryProfileFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryProfilePayload>\n }\n findMany: {\n args: Prisma.CommentaryProfileFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryProfilePayload>[]\n }\n create: {\n args: Prisma.CommentaryProfileCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryProfilePayload>\n }\n createMany: {\n args: Prisma.CommentaryProfileCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.CommentaryProfileCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryProfilePayload>[]\n }\n delete: {\n args: Prisma.CommentaryProfileDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryProfilePayload>\n }\n update: {\n args: Prisma.CommentaryProfileUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryProfilePayload>\n }\n deleteMany: {\n args: Prisma.CommentaryProfileDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.CommentaryProfileUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.CommentaryProfileUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryProfilePayload>[]\n }\n upsert: {\n args: Prisma.CommentaryProfileUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryProfilePayload>\n }\n aggregate: {\n args: Prisma.CommentaryProfileAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateCommentaryProfile>\n }\n groupBy: {\n args: Prisma.CommentaryProfileGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.CommentaryProfileGroupByOutputType>[]\n }\n count: {\n args: Prisma.CommentaryProfileCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.CommentaryProfileCountAggregateOutputType> | number\n }\n }\n }\n Chapter: {\n payload: Prisma.$ChapterPayload<ExtArgs>\n fields: Prisma.ChapterFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ChapterFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ChapterFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterPayload>\n }\n findFirst: {\n args: Prisma.ChapterFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ChapterFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterPayload>\n }\n findMany: {\n args: Prisma.ChapterFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterPayload>[]\n }\n create: {\n args: Prisma.ChapterCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterPayload>\n }\n createMany: {\n args: Prisma.ChapterCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ChapterCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterPayload>[]\n }\n delete: {\n args: Prisma.ChapterDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterPayload>\n }\n update: {\n args: Prisma.ChapterUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterPayload>\n }\n deleteMany: {\n args: Prisma.ChapterDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ChapterUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ChapterUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterPayload>[]\n }\n upsert: {\n args: Prisma.ChapterUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterPayload>\n }\n aggregate: {\n args: Prisma.ChapterAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateChapter>\n }\n groupBy: {\n args: Prisma.ChapterGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ChapterGroupByOutputType>[]\n }\n count: {\n args: Prisma.ChapterCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ChapterCountAggregateOutputType> | number\n }\n }\n }\n CommentaryChapter: {\n payload: Prisma.$CommentaryChapterPayload<ExtArgs>\n fields: Prisma.CommentaryChapterFieldRefs\n operations: {\n findUnique: {\n args: Prisma.CommentaryChapterFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.CommentaryChapterFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterPayload>\n }\n findFirst: {\n args: Prisma.CommentaryChapterFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.CommentaryChapterFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterPayload>\n }\n findMany: {\n args: Prisma.CommentaryChapterFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterPayload>[]\n }\n create: {\n args: Prisma.CommentaryChapterCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterPayload>\n }\n createMany: {\n args: Prisma.CommentaryChapterCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.CommentaryChapterCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterPayload>[]\n }\n delete: {\n args: Prisma.CommentaryChapterDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterPayload>\n }\n update: {\n args: Prisma.CommentaryChapterUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterPayload>\n }\n deleteMany: {\n args: Prisma.CommentaryChapterDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.CommentaryChapterUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.CommentaryChapterUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterPayload>[]\n }\n upsert: {\n args: Prisma.CommentaryChapterUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterPayload>\n }\n aggregate: {\n args: Prisma.CommentaryChapterAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateCommentaryChapter>\n }\n groupBy: {\n args: Prisma.CommentaryChapterGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.CommentaryChapterGroupByOutputType>[]\n }\n count: {\n args: Prisma.CommentaryChapterCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.CommentaryChapterCountAggregateOutputType> | number\n }\n }\n }\n ChapterAudioUrl: {\n payload: Prisma.$ChapterAudioUrlPayload<ExtArgs>\n fields: Prisma.ChapterAudioUrlFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ChapterAudioUrlFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioUrlPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ChapterAudioUrlFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioUrlPayload>\n }\n findFirst: {\n args: Prisma.ChapterAudioUrlFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioUrlPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ChapterAudioUrlFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioUrlPayload>\n }\n findMany: {\n args: Prisma.ChapterAudioUrlFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioUrlPayload>[]\n }\n create: {\n args: Prisma.ChapterAudioUrlCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioUrlPayload>\n }\n createMany: {\n args: Prisma.ChapterAudioUrlCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ChapterAudioUrlCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioUrlPayload>[]\n }\n delete: {\n args: Prisma.ChapterAudioUrlDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioUrlPayload>\n }\n update: {\n args: Prisma.ChapterAudioUrlUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioUrlPayload>\n }\n deleteMany: {\n args: Prisma.ChapterAudioUrlDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ChapterAudioUrlUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ChapterAudioUrlUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioUrlPayload>[]\n }\n upsert: {\n args: Prisma.ChapterAudioUrlUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioUrlPayload>\n }\n aggregate: {\n args: Prisma.ChapterAudioUrlAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateChapterAudioUrl>\n }\n groupBy: {\n args: Prisma.ChapterAudioUrlGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ChapterAudioUrlGroupByOutputType>[]\n }\n count: {\n args: Prisma.ChapterAudioUrlCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ChapterAudioUrlCountAggregateOutputType> | number\n }\n }\n }\n ChapterAudioTiming: {\n payload: Prisma.$ChapterAudioTimingPayload<ExtArgs>\n fields: Prisma.ChapterAudioTimingFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ChapterAudioTimingFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioTimingPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ChapterAudioTimingFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioTimingPayload>\n }\n findFirst: {\n args: Prisma.ChapterAudioTimingFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioTimingPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ChapterAudioTimingFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioTimingPayload>\n }\n findMany: {\n args: Prisma.ChapterAudioTimingFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioTimingPayload>[]\n }\n create: {\n args: Prisma.ChapterAudioTimingCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioTimingPayload>\n }\n createMany: {\n args: Prisma.ChapterAudioTimingCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ChapterAudioTimingCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioTimingPayload>[]\n }\n delete: {\n args: Prisma.ChapterAudioTimingDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioTimingPayload>\n }\n update: {\n args: Prisma.ChapterAudioTimingUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioTimingPayload>\n }\n deleteMany: {\n args: Prisma.ChapterAudioTimingDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ChapterAudioTimingUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ChapterAudioTimingUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioTimingPayload>[]\n }\n upsert: {\n args: Prisma.ChapterAudioTimingUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterAudioTimingPayload>\n }\n aggregate: {\n args: Prisma.ChapterAudioTimingAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateChapterAudioTiming>\n }\n groupBy: {\n args: Prisma.ChapterAudioTimingGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ChapterAudioTimingGroupByOutputType>[]\n }\n count: {\n args: Prisma.ChapterAudioTimingCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ChapterAudioTimingCountAggregateOutputType> | number\n }\n }\n }\n ChapterWords: {\n payload: Prisma.$ChapterWordsPayload<ExtArgs>\n fields: Prisma.ChapterWordsFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ChapterWordsFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterWordsPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ChapterWordsFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterWordsPayload>\n }\n findFirst: {\n args: Prisma.ChapterWordsFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterWordsPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ChapterWordsFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterWordsPayload>\n }\n findMany: {\n args: Prisma.ChapterWordsFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterWordsPayload>[]\n }\n create: {\n args: Prisma.ChapterWordsCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterWordsPayload>\n }\n createMany: {\n args: Prisma.ChapterWordsCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ChapterWordsCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterWordsPayload>[]\n }\n delete: {\n args: Prisma.ChapterWordsDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterWordsPayload>\n }\n update: {\n args: Prisma.ChapterWordsUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterWordsPayload>\n }\n deleteMany: {\n args: Prisma.ChapterWordsDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ChapterWordsUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ChapterWordsUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterWordsPayload>[]\n }\n upsert: {\n args: Prisma.ChapterWordsUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterWordsPayload>\n }\n aggregate: {\n args: Prisma.ChapterWordsAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateChapterWords>\n }\n groupBy: {\n args: Prisma.ChapterWordsGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ChapterWordsGroupByOutputType>[]\n }\n count: {\n args: Prisma.ChapterWordsCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ChapterWordsCountAggregateOutputType> | number\n }\n }\n }\n ChapterVerse: {\n payload: Prisma.$ChapterVersePayload<ExtArgs>\n fields: Prisma.ChapterVerseFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ChapterVerseFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterVersePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ChapterVerseFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterVersePayload>\n }\n findFirst: {\n args: Prisma.ChapterVerseFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterVersePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ChapterVerseFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterVersePayload>\n }\n findMany: {\n args: Prisma.ChapterVerseFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterVersePayload>[]\n }\n create: {\n args: Prisma.ChapterVerseCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterVersePayload>\n }\n createMany: {\n args: Prisma.ChapterVerseCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ChapterVerseCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterVersePayload>[]\n }\n delete: {\n args: Prisma.ChapterVerseDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterVersePayload>\n }\n update: {\n args: Prisma.ChapterVerseUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterVersePayload>\n }\n deleteMany: {\n args: Prisma.ChapterVerseDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ChapterVerseUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ChapterVerseUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterVersePayload>[]\n }\n upsert: {\n args: Prisma.ChapterVerseUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterVersePayload>\n }\n aggregate: {\n args: Prisma.ChapterVerseAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateChapterVerse>\n }\n groupBy: {\n args: Prisma.ChapterVerseGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ChapterVerseGroupByOutputType>[]\n }\n count: {\n args: Prisma.ChapterVerseCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ChapterVerseCountAggregateOutputType> | number\n }\n }\n }\n CommentaryChapterVerse: {\n payload: Prisma.$CommentaryChapterVersePayload<ExtArgs>\n fields: Prisma.CommentaryChapterVerseFieldRefs\n operations: {\n findUnique: {\n args: Prisma.CommentaryChapterVerseFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterVersePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.CommentaryChapterVerseFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterVersePayload>\n }\n findFirst: {\n args: Prisma.CommentaryChapterVerseFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterVersePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.CommentaryChapterVerseFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterVersePayload>\n }\n findMany: {\n args: Prisma.CommentaryChapterVerseFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterVersePayload>[]\n }\n create: {\n args: Prisma.CommentaryChapterVerseCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterVersePayload>\n }\n createMany: {\n args: Prisma.CommentaryChapterVerseCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.CommentaryChapterVerseCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterVersePayload>[]\n }\n delete: {\n args: Prisma.CommentaryChapterVerseDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterVersePayload>\n }\n update: {\n args: Prisma.CommentaryChapterVerseUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterVersePayload>\n }\n deleteMany: {\n args: Prisma.CommentaryChapterVerseDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.CommentaryChapterVerseUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.CommentaryChapterVerseUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterVersePayload>[]\n }\n upsert: {\n args: Prisma.CommentaryChapterVerseUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$CommentaryChapterVersePayload>\n }\n aggregate: {\n args: Prisma.CommentaryChapterVerseAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateCommentaryChapterVerse>\n }\n groupBy: {\n args: Prisma.CommentaryChapterVerseGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.CommentaryChapterVerseGroupByOutputType>[]\n }\n count: {\n args: Prisma.CommentaryChapterVerseCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.CommentaryChapterVerseCountAggregateOutputType> | number\n }\n }\n }\n ChapterFootnote: {\n payload: Prisma.$ChapterFootnotePayload<ExtArgs>\n fields: Prisma.ChapterFootnoteFieldRefs\n operations: {\n findUnique: {\n args: Prisma.ChapterFootnoteFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterFootnotePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.ChapterFootnoteFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterFootnotePayload>\n }\n findFirst: {\n args: Prisma.ChapterFootnoteFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterFootnotePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.ChapterFootnoteFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterFootnotePayload>\n }\n findMany: {\n args: Prisma.ChapterFootnoteFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterFootnotePayload>[]\n }\n create: {\n args: Prisma.ChapterFootnoteCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterFootnotePayload>\n }\n createMany: {\n args: Prisma.ChapterFootnoteCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.ChapterFootnoteCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterFootnotePayload>[]\n }\n delete: {\n args: Prisma.ChapterFootnoteDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterFootnotePayload>\n }\n update: {\n args: Prisma.ChapterFootnoteUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterFootnotePayload>\n }\n deleteMany: {\n args: Prisma.ChapterFootnoteDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.ChapterFootnoteUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.ChapterFootnoteUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterFootnotePayload>[]\n }\n upsert: {\n args: Prisma.ChapterFootnoteUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$ChapterFootnotePayload>\n }\n aggregate: {\n args: Prisma.ChapterFootnoteAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateChapterFootnote>\n }\n groupBy: {\n args: Prisma.ChapterFootnoteGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ChapterFootnoteGroupByOutputType>[]\n }\n count: {\n args: Prisma.ChapterFootnoteCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.ChapterFootnoteCountAggregateOutputType> | number\n }\n }\n }\n Dataset: {\n payload: Prisma.$DatasetPayload<ExtArgs>\n fields: Prisma.DatasetFieldRefs\n operations: {\n findUnique: {\n args: Prisma.DatasetFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.DatasetFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetPayload>\n }\n findFirst: {\n args: Prisma.DatasetFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.DatasetFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetPayload>\n }\n findMany: {\n args: Prisma.DatasetFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetPayload>[]\n }\n create: {\n args: Prisma.DatasetCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetPayload>\n }\n createMany: {\n args: Prisma.DatasetCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.DatasetCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetPayload>[]\n }\n delete: {\n args: Prisma.DatasetDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetPayload>\n }\n update: {\n args: Prisma.DatasetUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetPayload>\n }\n deleteMany: {\n args: Prisma.DatasetDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.DatasetUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.DatasetUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetPayload>[]\n }\n upsert: {\n args: Prisma.DatasetUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetPayload>\n }\n aggregate: {\n args: Prisma.DatasetAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateDataset>\n }\n groupBy: {\n args: Prisma.DatasetGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DatasetGroupByOutputType>[]\n }\n count: {\n args: Prisma.DatasetCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DatasetCountAggregateOutputType> | number\n }\n }\n }\n DatasetBook: {\n payload: Prisma.$DatasetBookPayload<ExtArgs>\n fields: Prisma.DatasetBookFieldRefs\n operations: {\n findUnique: {\n args: Prisma.DatasetBookFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetBookPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.DatasetBookFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetBookPayload>\n }\n findFirst: {\n args: Prisma.DatasetBookFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetBookPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.DatasetBookFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetBookPayload>\n }\n findMany: {\n args: Prisma.DatasetBookFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetBookPayload>[]\n }\n create: {\n args: Prisma.DatasetBookCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetBookPayload>\n }\n createMany: {\n args: Prisma.DatasetBookCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.DatasetBookCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetBookPayload>[]\n }\n delete: {\n args: Prisma.DatasetBookDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetBookPayload>\n }\n update: {\n args: Prisma.DatasetBookUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetBookPayload>\n }\n deleteMany: {\n args: Prisma.DatasetBookDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.DatasetBookUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.DatasetBookUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetBookPayload>[]\n }\n upsert: {\n args: Prisma.DatasetBookUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetBookPayload>\n }\n aggregate: {\n args: Prisma.DatasetBookAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateDatasetBook>\n }\n groupBy: {\n args: Prisma.DatasetBookGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DatasetBookGroupByOutputType>[]\n }\n count: {\n args: Prisma.DatasetBookCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DatasetBookCountAggregateOutputType> | number\n }\n }\n }\n DatasetChapter: {\n payload: Prisma.$DatasetChapterPayload<ExtArgs>\n fields: Prisma.DatasetChapterFieldRefs\n operations: {\n findUnique: {\n args: Prisma.DatasetChapterFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterPayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.DatasetChapterFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterPayload>\n }\n findFirst: {\n args: Prisma.DatasetChapterFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterPayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.DatasetChapterFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterPayload>\n }\n findMany: {\n args: Prisma.DatasetChapterFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterPayload>[]\n }\n create: {\n args: Prisma.DatasetChapterCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterPayload>\n }\n createMany: {\n args: Prisma.DatasetChapterCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.DatasetChapterCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterPayload>[]\n }\n delete: {\n args: Prisma.DatasetChapterDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterPayload>\n }\n update: {\n args: Prisma.DatasetChapterUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterPayload>\n }\n deleteMany: {\n args: Prisma.DatasetChapterDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.DatasetChapterUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.DatasetChapterUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterPayload>[]\n }\n upsert: {\n args: Prisma.DatasetChapterUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterPayload>\n }\n aggregate: {\n args: Prisma.DatasetChapterAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateDatasetChapter>\n }\n groupBy: {\n args: Prisma.DatasetChapterGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DatasetChapterGroupByOutputType>[]\n }\n count: {\n args: Prisma.DatasetChapterCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DatasetChapterCountAggregateOutputType> | number\n }\n }\n }\n DatasetChapterVerse: {\n payload: Prisma.$DatasetChapterVersePayload<ExtArgs>\n fields: Prisma.DatasetChapterVerseFieldRefs\n operations: {\n findUnique: {\n args: Prisma.DatasetChapterVerseFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterVersePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.DatasetChapterVerseFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterVersePayload>\n }\n findFirst: {\n args: Prisma.DatasetChapterVerseFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterVersePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.DatasetChapterVerseFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterVersePayload>\n }\n findMany: {\n args: Prisma.DatasetChapterVerseFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterVersePayload>[]\n }\n create: {\n args: Prisma.DatasetChapterVerseCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterVersePayload>\n }\n createMany: {\n args: Prisma.DatasetChapterVerseCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.DatasetChapterVerseCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterVersePayload>[]\n }\n delete: {\n args: Prisma.DatasetChapterVerseDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterVersePayload>\n }\n update: {\n args: Prisma.DatasetChapterVerseUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterVersePayload>\n }\n deleteMany: {\n args: Prisma.DatasetChapterVerseDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.DatasetChapterVerseUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.DatasetChapterVerseUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterVersePayload>[]\n }\n upsert: {\n args: Prisma.DatasetChapterVerseUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetChapterVersePayload>\n }\n aggregate: {\n args: Prisma.DatasetChapterVerseAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateDatasetChapterVerse>\n }\n groupBy: {\n args: Prisma.DatasetChapterVerseGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DatasetChapterVerseGroupByOutputType>[]\n }\n count: {\n args: Prisma.DatasetChapterVerseCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DatasetChapterVerseCountAggregateOutputType> | number\n }\n }\n }\n DatasetReference: {\n payload: Prisma.$DatasetReferencePayload<ExtArgs>\n fields: Prisma.DatasetReferenceFieldRefs\n operations: {\n findUnique: {\n args: Prisma.DatasetReferenceFindUniqueArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetReferencePayload> | null\n }\n findUniqueOrThrow: {\n args: Prisma.DatasetReferenceFindUniqueOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetReferencePayload>\n }\n findFirst: {\n args: Prisma.DatasetReferenceFindFirstArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetReferencePayload> | null\n }\n findFirstOrThrow: {\n args: Prisma.DatasetReferenceFindFirstOrThrowArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetReferencePayload>\n }\n findMany: {\n args: Prisma.DatasetReferenceFindManyArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetReferencePayload>[]\n }\n create: {\n args: Prisma.DatasetReferenceCreateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetReferencePayload>\n }\n createMany: {\n args: Prisma.DatasetReferenceCreateManyArgs<ExtArgs>\n result: BatchPayload\n }\n createManyAndReturn: {\n args: Prisma.DatasetReferenceCreateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetReferencePayload>[]\n }\n delete: {\n args: Prisma.DatasetReferenceDeleteArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetReferencePayload>\n }\n update: {\n args: Prisma.DatasetReferenceUpdateArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetReferencePayload>\n }\n deleteMany: {\n args: Prisma.DatasetReferenceDeleteManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateMany: {\n args: Prisma.DatasetReferenceUpdateManyArgs<ExtArgs>\n result: BatchPayload\n }\n updateManyAndReturn: {\n args: Prisma.DatasetReferenceUpdateManyAndReturnArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetReferencePayload>[]\n }\n upsert: {\n args: Prisma.DatasetReferenceUpsertArgs<ExtArgs>\n result: runtime.Types.Utils.PayloadToResult<Prisma.$DatasetReferencePayload>\n }\n aggregate: {\n args: Prisma.DatasetReferenceAggregateArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.AggregateDatasetReference>\n }\n groupBy: {\n args: Prisma.DatasetReferenceGroupByArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DatasetReferenceGroupByOutputType>[]\n }\n count: {\n args: Prisma.DatasetReferenceCountArgs<ExtArgs>\n result: runtime.Types.Utils.Optional<Prisma.DatasetReferenceCountAggregateOutputType> | number\n }\n }\n }\n }\n} & {\n other: {\n payload: any\n operations: {\n $executeRaw: {\n args: [query: TemplateStringsArray | Sql, ...values: any[]],\n result: any\n }\n $executeRawUnsafe: {\n args: [query: string, ...values: any[]],\n result: any\n }\n $queryRaw: {\n args: [query: TemplateStringsArray | Sql, ...values: any[]],\n result: any\n }\n $queryRawUnsafe: {\n args: [query: string, ...values: any[]],\n result: any\n }\n }\n }\n}\n\n/**\n * Enums\n */\n\nexport const TransactionIsolationLevel = runtime.makeStrictEnum({\n Serializable: 'Serializable'\n} as const)\n\nexport type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel]\n\n\nexport const TranslationScalarFieldEnum = {\n id: 'id',\n name: 'name',\n website: 'website',\n licenseUrl: 'licenseUrl',\n licenseNotes: 'licenseNotes',\n licenseNotice: 'licenseNotice',\n shortName: 'shortName',\n englishName: 'englishName',\n language: 'language',\n textDirection: 'textDirection',\n sha256: 'sha256'\n} as const\n\nexport type TranslationScalarFieldEnum = (typeof TranslationScalarFieldEnum)[keyof typeof TranslationScalarFieldEnum]\n\n\nexport const CommentaryScalarFieldEnum = {\n id: 'id',\n name: 'name',\n website: 'website',\n licenseUrl: 'licenseUrl',\n licenseNotes: 'licenseNotes',\n licenseNotice: 'licenseNotice',\n englishName: 'englishName',\n language: 'language',\n textDirection: 'textDirection',\n sha256: 'sha256'\n} as const\n\nexport type CommentaryScalarFieldEnum = (typeof CommentaryScalarFieldEnum)[keyof typeof CommentaryScalarFieldEnum]\n\n\nexport const EBibleSourceScalarFieldEnum = {\n id: 'id',\n usfmZipUrl: 'usfmZipUrl',\n usfmZipEtag: 'usfmZipEtag',\n languageCode: 'languageCode',\n title: 'title',\n shortTitle: 'shortTitle',\n textDirection: 'textDirection',\n redistributable: 'redistributable',\n description: 'description',\n copyright: 'copyright',\n FCBHID: 'FCBHID',\n updateDate: 'updateDate',\n sourceDate: 'sourceDate',\n oldTestamentBooks: 'oldTestamentBooks',\n oldTestamentChapters: 'oldTestamentChapters',\n oldTestamentVerses: 'oldTestamentVerses',\n newTestamentBooks: 'newTestamentBooks',\n newTestamentChapters: 'newTestamentChapters',\n newTestamentVerses: 'newTestamentVerses',\n apocryphaBooks: 'apocryphaBooks',\n apocryphaChapters: 'apocryphaChapters',\n apocryphaVerses: 'apocryphaVerses',\n translationId: 'translationId',\n usfmDownloadDate: 'usfmDownloadDate',\n usfmDownloadPath: 'usfmDownloadPath',\n sha256: 'sha256'\n} as const\n\nexport type EBibleSourceScalarFieldEnum = (typeof EBibleSourceScalarFieldEnum)[keyof typeof EBibleSourceScalarFieldEnum]\n\n\nexport const InputFileScalarFieldEnum = {\n translationId: 'translationId',\n name: 'name',\n format: 'format',\n sha256: 'sha256',\n sizeInBytes: 'sizeInBytes'\n} as const\n\nexport type InputFileScalarFieldEnum = (typeof InputFileScalarFieldEnum)[keyof typeof InputFileScalarFieldEnum]\n\n\nexport const InputFileWarningScalarFieldEnum = {\n name: 'name',\n type: 'type',\n message: 'message'\n} as const\n\nexport type InputFileWarningScalarFieldEnum = (typeof InputFileWarningScalarFieldEnum)[keyof typeof InputFileWarningScalarFieldEnum]\n\n\nexport const BookScalarFieldEnum = {\n id: 'id',\n translationId: 'translationId',\n name: 'name',\n commonName: 'commonName',\n title: 'title',\n order: 'order',\n numberOfChapters: 'numberOfChapters',\n isApocryphal: 'isApocryphal',\n sha256: 'sha256'\n} as const\n\nexport type BookScalarFieldEnum = (typeof BookScalarFieldEnum)[keyof typeof BookScalarFieldEnum]\n\n\nexport const CommentaryBookScalarFieldEnum = {\n id: 'id',\n commentaryId: 'commentaryId',\n name: 'name',\n commonName: 'commonName',\n introduction: 'introduction',\n introductionSummary: 'introductionSummary',\n order: 'order',\n numberOfChapters: 'numberOfChapters',\n sha256: 'sha256'\n} as const\n\nexport type CommentaryBookScalarFieldEnum = (typeof CommentaryBookScalarFieldEnum)[keyof typeof CommentaryBookScalarFieldEnum]\n\n\nexport const CommentaryProfileScalarFieldEnum = {\n id: 'id',\n commentaryId: 'commentaryId',\n subject: 'subject',\n content: 'content',\n referenceBook: 'referenceBook',\n referenceChapter: 'referenceChapter',\n referenceVerse: 'referenceVerse',\n referenceEndChapter: 'referenceEndChapter',\n referenceEndVerse: 'referenceEndVerse',\n json: 'json',\n sha256: 'sha256'\n} as const\n\nexport type CommentaryProfileScalarFieldEnum = (typeof CommentaryProfileScalarFieldEnum)[keyof typeof CommentaryProfileScalarFieldEnum]\n\n\nexport const ChapterScalarFieldEnum = {\n number: 'number',\n bookId: 'bookId',\n translationId: 'translationId',\n json: 'json',\n sha256: 'sha256'\n} as const\n\nexport type ChapterScalarFieldEnum = (typeof ChapterScalarFieldEnum)[keyof typeof ChapterScalarFieldEnum]\n\n\nexport const CommentaryChapterScalarFieldEnum = {\n number: 'number',\n bookId: 'bookId',\n commentaryId: 'commentaryId',\n introduction: 'introduction',\n json: 'json',\n sha256: 'sha256'\n} as const\n\nexport type CommentaryChapterScalarFieldEnum = (typeof CommentaryChapterScalarFieldEnum)[keyof typeof CommentaryChapterScalarFieldEnum]\n\n\nexport const ChapterAudioUrlScalarFieldEnum = {\n number: 'number',\n bookId: 'bookId',\n translationId: 'translationId',\n reader: 'reader',\n url: 'url'\n} as const\n\nexport type ChapterAudioUrlScalarFieldEnum = (typeof ChapterAudioUrlScalarFieldEnum)[keyof typeof ChapterAudioUrlScalarFieldEnum]\n\n\nexport const ChapterAudioTimingScalarFieldEnum = {\n number: 'number',\n bookId: 'bookId',\n translationId: 'translationId',\n reader: 'reader',\n timingsJson: 'timingsJson'\n} as const\n\nexport type ChapterAudioTimingScalarFieldEnum = (typeof ChapterAudioTimingScalarFieldEnum)[keyof typeof ChapterAudioTimingScalarFieldEnum]\n\n\nexport const ChapterWordsScalarFieldEnum = {\n number: 'number',\n bookId: 'bookId',\n translationId: 'translationId',\n wordsJson: 'wordsJson'\n} as const\n\nexport type ChapterWordsScalarFieldEnum = (typeof ChapterWordsScalarFieldEnum)[keyof typeof ChapterWordsScalarFieldEnum]\n\n\nexport const ChapterVerseScalarFieldEnum = {\n number: 'number',\n chapterNumber: 'chapterNumber',\n bookId: 'bookId',\n translationId: 'translationId',\n text: 'text',\n contentJson: 'contentJson',\n sha256: 'sha256'\n} as const\n\nexport type ChapterVerseScalarFieldEnum = (typeof ChapterVerseScalarFieldEnum)[keyof typeof ChapterVerseScalarFieldEnum]\n\n\nexport const CommentaryChapterVerseScalarFieldEnum = {\n number: 'number',\n chapterNumber: 'chapterNumber',\n bookId: 'bookId',\n commentaryId: 'commentaryId',\n text: 'text',\n contentJson: 'contentJson',\n sha256: 'sha256'\n} as const\n\nexport type CommentaryChapterVerseScalarFieldEnum = (typeof CommentaryChapterVerseScalarFieldEnum)[keyof typeof CommentaryChapterVerseScalarFieldEnum]\n\n\nexport const ChapterFootnoteScalarFieldEnum = {\n id: 'id',\n chapterNumber: 'chapterNumber',\n bookId: 'bookId',\n translationId: 'translationId',\n text: 'text',\n sha256: 'sha256',\n verseNumber: 'verseNumber'\n} as const\n\nexport type ChapterFootnoteScalarFieldEnum = (typeof ChapterFootnoteScalarFieldEnum)[keyof typeof ChapterFootnoteScalarFieldEnum]\n\n\nexport const DatasetScalarFieldEnum = {\n id: 'id',\n name: 'name',\n website: 'website',\n licenseUrl: 'licenseUrl',\n licenseNotes: 'licenseNotes',\n englishName: 'englishName',\n language: 'language',\n textDirection: 'textDirection',\n sha256: 'sha256'\n} as const\n\nexport type DatasetScalarFieldEnum = (typeof DatasetScalarFieldEnum)[keyof typeof DatasetScalarFieldEnum]\n\n\nexport const DatasetBookScalarFieldEnum = {\n id: 'id',\n datasetId: 'datasetId',\n order: 'order',\n numberOfChapters: 'numberOfChapters',\n sha256: 'sha256'\n} as const\n\nexport type DatasetBookScalarFieldEnum = (typeof DatasetBookScalarFieldEnum)[keyof typeof DatasetBookScalarFieldEnum]\n\n\nexport const DatasetChapterScalarFieldEnum = {\n number: 'number',\n bookId: 'bookId',\n datasetId: 'datasetId',\n json: 'json',\n sha256: 'sha256'\n} as const\n\nexport type DatasetChapterScalarFieldEnum = (typeof DatasetChapterScalarFieldEnum)[keyof typeof DatasetChapterScalarFieldEnum]\n\n\nexport const DatasetChapterVerseScalarFieldEnum = {\n number: 'number',\n chapterNumber: 'chapterNumber',\n bookId: 'bookId',\n datasetId: 'datasetId',\n contentJson: 'contentJson',\n sha256: 'sha256'\n} as const\n\nexport type DatasetChapterVerseScalarFieldEnum = (typeof DatasetChapterVerseScalarFieldEnum)[keyof typeof DatasetChapterVerseScalarFieldEnum]\n\n\nexport const DatasetReferenceScalarFieldEnum = {\n id: 'id',\n datasetId: 'datasetId',\n bookId: 'bookId',\n chapterNumber: 'chapterNumber',\n verseNumber: 'verseNumber',\n referenceBookId: 'referenceBookId',\n referenceChapter: 'referenceChapter',\n referenceVerse: 'referenceVerse',\n endVerseNumber: 'endVerseNumber',\n score: 'score'\n} as const\n\nexport type DatasetReferenceScalarFieldEnum = (typeof DatasetReferenceScalarFieldEnum)[keyof typeof DatasetReferenceScalarFieldEnum]\n\n\nexport const SortOrder = {\n asc: 'asc',\n desc: 'desc'\n} as const\n\nexport type SortOrder = (typeof SortOrder)[keyof typeof SortOrder]\n\n\nexport const NullsOrder = {\n first: 'first',\n last: 'last'\n} as const\n\nexport type NullsOrder = (typeof NullsOrder)[keyof typeof NullsOrder]\n\n\n\n/**\n * Field references\n */\n\n\n/**\n * Reference to a field of type 'String'\n */\nexport type StringFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'String'>\n \n\n\n/**\n * Reference to a field of type 'Boolean'\n */\nexport type BooleanFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Boolean'>\n \n\n\n/**\n * Reference to a field of type 'DateTime'\n */\nexport type DateTimeFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'DateTime'>\n \n\n\n/**\n * Reference to a field of type 'Int'\n */\nexport type IntFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Int'>\n \n\n\n/**\n * Reference to a field of type 'Float'\n */\nexport type FloatFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Float'>\n \n\n/**\n * Batch Payload for updateMany & deleteMany & createMany\n */\nexport type BatchPayload = {\n count: number\n}\n\nexport const defineExtension = runtime.Extensions.defineExtension as unknown as runtime.Types.Extensions.ExtendsHook<\"define\", TypeMapCb, runtime.Types.Extensions.DefaultArgs>\nexport type DefaultPrismaClient = PrismaClient\nexport type ErrorFormat = 'pretty' | 'colorless' | 'minimal'\nexport type PrismaClientOptions = ({\n /**\n * Instance of a Driver Adapter, e.g., like one provided by `@prisma/adapter-pg`.\n */\n adapter: runtime.SqlDriverAdapterFactory\n accelerateUrl?: never\n} | {\n /**\n * Prisma Accelerate URL allowing the client to connect through Accelerate instead of a direct database.\n */\n accelerateUrl: string\n adapter?: never\n}) & {\n /**\n * @default \"colorless\"\n */\n errorFormat?: ErrorFormat\n /**\n * @example\n * ```\n * // Shorthand for `emit: 'stdout'`\n * log: ['query', 'info', 'warn', 'error']\n * \n * // Emit as events only\n * log: [\n * { emit: 'event', level: 'query' },\n * { emit: 'event', level: 'info' },\n * { emit: 'event', level: 'warn' }\n * { emit: 'event', level: 'error' }\n * ]\n * \n * / Emit as events and log to stdout\n * og: [\n * { emit: 'stdout', level: 'query' },\n * { emit: 'stdout', level: 'info' },\n * { emit: 'stdout', level: 'warn' }\n * { emit: 'stdout', level: 'error' }\n * \n * ```\n * Read more in our [docs](https://pris.ly/d/logging).\n */\n log?: (LogLevel | LogDefinition)[]\n /**\n * The default values for transactionOptions\n * maxWait ?= 2000\n * timeout ?= 5000\n */\n transactionOptions?: {\n maxWait?: number\n timeout?: number\n isolationLevel?: TransactionIsolationLevel\n }\n /**\n * Global configuration for omitting model fields by default.\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * omit: {\n * user: {\n * password: true\n * }\n * }\n * })\n * ```\n */\n omit?: GlobalOmitConfig\n /**\n * SQL commenter plugins that add metadata to SQL queries as comments.\n * Comments follow the sqlcommenter format: https://google.github.io/sqlcommenter/\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter,\n * comments: [\n * traceContext(),\n * queryInsights(),\n * ],\n * })\n * ```\n */\n comments?: runtime.SqlCommenterPlugin[]\n /**\n * Optional maximum size for the query plan cache. If not provided, a default size will be used.\n * A value of `0` can be used to disable the cache entirely. A higher cache size can improve\n * performance for applications that execute a large number of unique queries, while a smaller\n * cache size can reduce memory usage.\n * \n * @example\n * ```\n * const prisma = new PrismaClient({\n * adapter,\n * queryPlanCacheMaxSize: 100,\n * })\n * ```\n */\n queryPlanCacheMaxSize?: number\n}\nexport type GlobalOmitConfig = {\n translation?: Prisma.TranslationOmit\n commentary?: Prisma.CommentaryOmit\n eBibleSource?: Prisma.EBibleSourceOmit\n inputFile?: Prisma.InputFileOmit\n inputFileWarning?: Prisma.InputFileWarningOmit\n book?: Prisma.BookOmit\n commentaryBook?: Prisma.CommentaryBookOmit\n commentaryProfile?: Prisma.CommentaryProfileOmit\n chapter?: Prisma.ChapterOmit\n commentaryChapter?: Prisma.CommentaryChapterOmit\n chapterAudioUrl?: Prisma.ChapterAudioUrlOmit\n chapterAudioTiming?: Prisma.ChapterAudioTimingOmit\n chapterWords?: Prisma.ChapterWordsOmit\n chapterVerse?: Prisma.ChapterVerseOmit\n commentaryChapterVerse?: Prisma.CommentaryChapterVerseOmit\n chapterFootnote?: Prisma.ChapterFootnoteOmit\n dataset?: Prisma.DatasetOmit\n datasetBook?: Prisma.DatasetBookOmit\n datasetChapter?: Prisma.DatasetChapterOmit\n datasetChapterVerse?: Prisma.DatasetChapterVerseOmit\n datasetReference?: Prisma.DatasetReferenceOmit\n}\n\n/* Types for Logging */\nexport type LogLevel = 'info' | 'query' | 'warn' | 'error'\nexport type LogDefinition = {\n level: LogLevel\n emit: 'stdout' | 'event'\n}\n\nexport type CheckIsLogLevel<T> = T extends LogLevel ? T : never;\n\nexport type GetLogType<T> = CheckIsLogLevel<\n T extends LogDefinition ? T['level'] : T\n>;\n\nexport type GetEvents<T extends any[]> = T extends Array<LogLevel | LogDefinition>\n ? GetLogType<T[number]>\n : never;\n\nexport type QueryEvent = {\n timestamp: Date\n query: string\n params: string\n duration: number\n target: string\n}\n\nexport type LogEvent = {\n timestamp: Date\n message: string\n target: string\n}\n/* End Types for Logging */\n\n\nexport type PrismaAction =\n | 'findUnique'\n | 'findUniqueOrThrow'\n | 'findMany'\n | 'findFirst'\n | 'findFirstOrThrow'\n | 'create'\n | 'createMany'\n | 'createManyAndReturn'\n | 'update'\n | 'updateMany'\n | 'updateManyAndReturn'\n | 'upsert'\n | 'delete'\n | 'deleteMany'\n | 'executeRaw'\n | 'queryRaw'\n | 'aggregate'\n | 'count'\n | 'runCommandRaw'\n | 'findRaw'\n | 'groupBy'\n\n/**\n * `PrismaClient` proxy available in interactive transactions.\n */\nexport type TransactionClient = Omit<DefaultPrismaClient, runtime.ITXClientDenyList>\n\n", "import { PrismaClient, Prisma } from './prisma-gen/client.js';\nimport path from 'path';\nimport Sql, { Database } from 'better-sqlite3';\nimport fsExtra from 'fs-extra';\nconst { exists, readdir, readFile } = fsExtra;\nimport { randomUUID } from 'node:crypto';\nimport {\n DatasetCommentary,\n DatasetCommentaryBook,\n DatasetCommentaryProfile,\n DatasetDataset,\n DatasetDatasetBook,\n DatasetOutput,\n DatasetTranslation,\n DatasetTranslationBook,\n generateDataset,\n} from '@helloao/tools/generation/dataset.js';\nimport {\n ChapterVerse,\n InputFile,\n TranslationBookChapter,\n OutputFile,\n OutputFileContent,\n CommentaryBookChapter,\n DatasetBookChapter,\n DatasetChapterVerseContent,\n Dataset,\n DatasetBook,\n} from '@helloao/tools/generation/index.js';\nimport {\n generateApiForDataset,\n GenerateApiOptions,\n generateFilesForApi,\n generateOutputFilesFromDatasets,\n} from '@helloao/tools/generation/api.js';\nimport {\n loadCommentaryFiles,\n loadTranslationFiles,\n serializeOutputFiles,\n} from './files.js';\nimport hash from 'hash.js';\nconst { sha256 } = hash;\nimport type { DOMParser } from 'linkedom';\nimport { Readable } from 'stream';\nimport { getEnglishName, getNativeName } from 'all-iso-language-codes';\nimport { log } from '@helloao/tools';\nimport { ParseMessage } from '@helloao/tools/parser/types.js';\nimport { BookId } from '@helloao/tools/utils.js';\nimport { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3';\n\nlet dirname = __dirname;\nif (!dirname) {\n // @ts-ignore\n dirname = import.meta.dirname;\n}\n\nexport async function getMigrationsPath() {\n const migrationsPaths = ['../../migrations'];\n\n for (let migrationsPath of migrationsPaths) {\n const fullPath = path.resolve(dirname, migrationsPath);\n if (await exists(fullPath)) {\n return fullPath;\n }\n }\n\n return null;\n}\n\n/**\n * Imports the translations from the given directories into the database.\n * @param db The database to import the translations into.\n * @param dirs The directories to import the translations from.\n * @param parser The DOM parser that should be used for USX files.\n * @param overwrite Whether to force a reload of the translations.\n */\nexport const importTranslations = (\n db: Database,\n dirs: string[],\n parser: DOMParser,\n overwrite: boolean\n) => importFiles(loadTranslationFiles, db, dirs, parser, overwrite);\n\n/**\n * Imports the commentaries from the given directories into the database.\n * @param db The database to import the commentaries into.\n * @param dirs The directories to import the commentaries from.\n * @param parser The DOM parser that should be used for USX files.\n * @param overwrite Whether to force a reload of the commentaries.\n */\nexport const importCommentaries = (\n db: Database,\n dirs: string[],\n parser: DOMParser,\n overwrite: boolean\n) => importFiles(loadCommentaryFiles, db, dirs, parser, overwrite);\n\n/**\n * Imports the files from the given directories into the database.\n * @param loadFilesFromDir The function that should be used to load the files from the given directory.\n * @param db The database to import the files into.\n * @param dirs The directories to import the files from.\n * @param parser The DOM parser that should be used for USX files.\n * @param overwrite Whether to force a reload of the files.\n */\nexport async function importFiles(\n loadFilesFromDir: (path: string) => Promise<InputFile[] | null>,\n db: Database,\n dirs: string[],\n parser: DOMParser,\n overwrite: boolean\n) {\n const logger = log.getLogger();\n let batches = [] as string[][];\n while (dirs.length > 0) {\n batches.push(dirs.splice(0, 10));\n }\n\n logger.log('Processing', batches.length, 'batches of directories');\n for (let i = 0; i < batches.length; i++) {\n const batch = batches[i];\n logger.log(`Processing batch ${i + 1} of ${batches.length}`);\n await loadAndImportBatch(\n loadFilesFromDir,\n db,\n batch,\n parser,\n overwrite\n );\n }\n}\n\n/**\n * Imports a batch of translations from the given directories into the database.\n * @param db The database to import the translations into.\n * @param dirs The directories that contain the translations.\n * @param parser The DOM parser that should be used for USX files.\n * @param overwrite Whether to force a reload of the translations.\n */\nexport const importTranslationBatch = (\n db: Database,\n dirs: string[],\n parser: DOMParser,\n overwrite: boolean\n) => loadAndImportBatch(loadTranslationFiles, db, dirs, parser, overwrite);\n\n/**\n * Imports a batch of files from the given directories into the database.\n * @param loadFilesFromDir The function that should be used to load the files from the given directory.\n * @param db The database to import the files into.\n * @param dirs The directories that contain the files.\n * @param parser The DOM parser that should be used for USX files.\n * @param overwrite Whether to force a reload of the files.\n */\nexport async function loadAndImportBatch(\n loadFilesFromDir: (path: string) => Promise<InputFile[] | null>,\n db: Database,\n dirs: string[],\n parser: DOMParser,\n overwrite: boolean\n) {\n const promises = [] as Promise<InputFile[]>[];\n for (let dir of dirs) {\n const fullPath = path.resolve(dir);\n promises.push(loadFilesFromDir(fullPath).then((files) => files ?? []));\n }\n\n const allFiles = await Promise.all(promises);\n const files = allFiles.flat();\n await importFileBatch(db, files, parser, overwrite);\n}\n\n/**\n * Parses and imports the given files into the database.\n * @param db The database to import the files into.\n * @param files The files that should be parsed.\n * @param parser The DOM parser that should be used for USX files.\n * @param overwrite Whether to force a reload of the translations.\n */\nexport async function importFileBatch(\n db: Database,\n files: InputFile[],\n parser: DOMParser,\n overwrite: boolean\n) {\n const logger = log.getLogger();\n logger.log('Importing', files.length, 'files');\n if (overwrite) {\n logger.log('Overwriting existing translations.');\n }\n const changedFiles = overwrite\n ? files\n : getChangedOrNewInputFiles(db, files);\n\n logger.log('Processing', changedFiles.length, 'changed files');\n logger.log(\n 'Skipping',\n files.length - changedFiles.length,\n 'unchanged files'\n );\n\n const output = generateDataset(\n changedFiles,\n parser as globalThis.DOMParser\n );\n\n logger.log('Generated', output.translations.length, 'translations');\n logger.log('Generated', output.commentaries.length, 'commentaries');\n\n importDatasetOutput(db, output);\n insertFileMetadata(db, changedFiles);\n}\n\n/**\n * Imports the given dataset output into the database.\n * @param db The database to import the dataset into.\n * @param output The dataset output to import.\n */\nexport function importDatasetOutput(db: Database, output: DatasetOutput) {\n const logger = log.getLogger();\n\n insertTranslations(db, output.translations);\n updateTranslationHashes(db, output.translations);\n insertCommentaries(db, output.commentaries);\n updateCommentaryHashes(db, output.commentaries);\n insertDatasets(db, output.datasets ?? []);\n updateDatasetHashes(db, output.datasets ?? []);\n insertWarningMetadata(db, output.parseMessages);\n\n logger.log(`Inserted ${output.translations.length} translations into DB`);\n logger.log(`Inserted ${output.commentaries.length} commentaries into DB`);\n if (output.datasets) {\n logger.log(`Inserted ${output.datasets.length} datasets into DB`);\n }\n logger.log(\n `Produced ${output.parseMessages?.length ?? 0} warnings/errors.`\n );\n}\n\n/**\n * Filters the given input files to only include those that have changed.\n * @param db The database to check for changes.\n * @param files The files to filter.\n */\nexport function getChangedOrNewInputFiles(\n db: Database,\n files: InputFile[]\n): InputFile[] {\n const fileExists = db.prepare(\n 'SELECT COUNT(*) as c FROM InputFile WHERE translationId = @translationId AND name = @name AND sha256 = @sha256;'\n );\n\n return files.filter((f) => {\n const count = fileExists.get({\n translationId: f.metadata.id,\n name: path.basename(f.name!),\n sha256: f.sha256,\n }) as { c: number };\n\n return count.c <= 0;\n });\n}\n\nexport function insertFileMetadata(db: Database, files: InputFile[]) {\n const fileUpsert = db.prepare(`INSERT INTO InputFile(\n translationId,\n name,\n format,\n sha256,\n sizeInBytes\n ) VALUES (\n @translationId,\n @name,\n @format,\n @sha256,\n @sizeInBytes\n ) ON CONFLICT(translationId, name) DO \n UPDATE SET\n format=excluded.format,\n sha256=excluded.sha256,\n sizeInBytes=excluded.sizeInBytes;`);\n\n const insertManyFiles = db.transaction((files: InputFile[]) => {\n for (let file of files) {\n fileUpsert.run({\n translationId: file.metadata.id,\n name: path.basename(file.name!),\n format: file.fileType,\n sha256: file.sha256,\n sizeInBytes: file.content.length,\n });\n }\n });\n\n insertManyFiles(files);\n}\n\nexport function insertTranslations(\n db: Database,\n translations: DatasetTranslation[]\n) {\n const translationUpsert = db.prepare(`INSERT INTO Translation(\n id,\n name,\n language,\n shortName,\n textDirection,\n licenseUrl,\n licenseNotes,\n licenseNotice,\n website,\n englishName\n ) VALUES (\n @id,\n @name,\n @language,\n @shortName,\n @textDirection,\n @licenseUrl,\n @licenseNotes,\n @licenseNotice,\n @website,\n @englishName\n ) ON CONFLICT(id) DO \n UPDATE SET\n name=excluded.name,\n language=excluded.language,\n shortName=excluded.shortName,\n textDirection=excluded.textDirection,\n licenseUrl=excluded.licenseUrl,\n licenseNotes=excluded.licenseNotes,\n licenseNotice=excluded.licenseNotice,\n website=excluded.website,\n englishName=excluded.englishName;`);\n\n const insertManyTranslations = db.transaction(\n (translations: DatasetTranslation[]) => {\n for (let translation of translations) {\n translationUpsert.run({\n id: translation.id,\n name: translation.name,\n language: translation.language,\n shortName: translation.shortName,\n textDirection: translation.textDirection,\n licenseUrl: translation.licenseUrl,\n licenseNotes: translation.licenseNotes,\n licenseNotice: translation.licenseNotice,\n website: translation.website,\n englishName: translation.englishName,\n });\n }\n }\n );\n\n insertManyTranslations(translations);\n\n for (let translation of translations) {\n insertTranslationBooks(db, translation, translation.books);\n }\n}\n\nexport function insertTranslationBooks(\n db: Database,\n translation: DatasetTranslation,\n translationBooks: DatasetTranslationBook[]\n) {\n const bookUpsert = db.prepare(`INSERT INTO Book(\n id,\n translationId,\n title,\n name,\n commonName,\n numberOfChapters,\n \\`order\\`,\n isApocryphal\n ) VALUES (\n @id,\n @translationId,\n @title,\n @name,\n @commonName,\n @numberOfChapters,\n @bookOrder,\n @isApocryphal\n ) ON CONFLICT(id,translationId) DO \n UPDATE SET\n title=excluded.title,\n name=excluded.name,\n commonName=excluded.commonName,\n numberOfChapters=excluded.numberOfChapters,\n isApocryphal=excluded.isApocryphal;`);\n\n const insertMany = db.transaction((books: DatasetTranslationBook[]) => {\n for (let book of books) {\n if (!book) {\n continue;\n }\n bookUpsert.run({\n id: book.id,\n translationId: translation.id,\n title: book.title,\n name: book.name,\n commonName: book.commonName,\n numberOfChapters: book.chapters.length,\n bookOrder: book.order ?? 9999,\n isApocryphal: Number(book.isApocryphal ?? false),\n });\n }\n });\n\n insertMany(translationBooks);\n\n for (let book of translationBooks) {\n insertTranslationContent(db, translation, book, book.chapters);\n }\n}\n\nexport function insertTranslationContent(\n db: Database,\n translation: DatasetTranslation,\n book: DatasetTranslationBook,\n chapters: TranslationBookChapter[]\n) {\n const logger = log.getLogger();\n\n const chapterUpsert = db.prepare(`INSERT INTO Chapter(\n translationId,\n bookId,\n number,\n json\n ) VALUES (\n @translationId,\n @bookId,\n @number,\n @json\n ) ON CONFLICT(translationId,bookId,number) DO \n UPDATE SET\n json=excluded.json;`);\n const verseUpsert = db.prepare(`INSERT INTO ChapterVerse(\n translationId,\n bookId,\n chapterNumber,\n number,\n text,\n contentJson\n ) VALUES (\n @translationId,\n @bookId,\n @chapterNumber,\n @number,\n @text,\n @contentJson\n ) ON CONFLICT(translationId,bookId,chapterNumber,number) DO \n UPDATE SET\n text=excluded.text,\n contentJson=excluded.contentJson;`);\n const footnoteUpsert = db.prepare(`INSERT INTO ChapterFootnote(\n translationId,\n bookId,\n chapterNumber,\n id,\n verseNumber,\n text\n ) VALUES (\n @translationId,\n @bookId,\n @chapterNumber,\n @id,\n @verseNumber,\n @text\n ) ON CONFLICT(translationId,bookId,chapterNumber,id) DO \n UPDATE SET\n verseNumber=excluded.verseNumber,\n text=excluded.text;`);\n\n const chapterAudioUpsert = db.prepare(`INSERT INTO ChapterAudioUrl(\n translationId,\n bookId,\n number,\n reader,\n url\n ) VALUES (\n @translationId,\n @bookId,\n @number,\n @reader,\n @url\n ) ON CONFLICT(translationId,bookId,number,reader) DO\n UPDATE SET\n url=excluded.url;`);\n\n const chapterAudioTimingUpsert = db.prepare(`INSERT INTO ChapterAudioTiming(\n translationId,\n bookId,\n number,\n reader,\n timingsJson\n ) VALUES (\n @translationId,\n @bookId,\n @number,\n @reader,\n @timingsJson\n ) ON CONFLICT(translationId,bookId,number,reader) DO\n UPDATE SET\n timingsJson=excluded.timingsJson;`);\n\n const chapterWordsUpsert = db.prepare(`INSERT INTO ChapterWords(\n translationId,\n bookId,\n number,\n wordsJson\n ) VALUES (\n @translationId,\n @bookId,\n @number,\n @wordsJson\n ) ON CONFLICT(translationId,bookId,number) DO\n UPDATE SET\n wordsJson=excluded.wordsJson;`);\n\n const insertChaptersAndVerses = db.transaction(() => {\n for (let chapter of chapters) {\n let verses: {\n number: number;\n text: string;\n contentJson: string;\n }[] = [];\n let footnotes: Map<\n number,\n {\n id: number;\n text: string;\n verseNumber?: number;\n }\n > = new Map();\n\n for (let c of chapter.chapter.footnotes) {\n footnotes.set(c.noteId, {\n id: c.noteId,\n text: c.text,\n });\n }\n\n for (let c of chapter.chapter.content) {\n if (c.type === 'verse') {\n const verse: ChapterVerse = c;\n if (!verse.number) {\n logger.error(\n 'Verse missing number',\n translation.id,\n book.id,\n chapter.chapter.number,\n verse.number\n );\n continue;\n }\n\n let text = '';\n for (let c of verse.content) {\n if (typeof c === 'string') {\n text += c + ' ';\n } else if (typeof c === 'object') {\n if ('lineBreak' in c) {\n text += '\\n';\n } else if ('text' in c) {\n text += c.text + ' ';\n } else if ('noteId' in c) {\n const note = footnotes.get(c.noteId);\n if (note) {\n note.verseNumber = verse.number;\n }\n }\n }\n }\n\n let contentJson = JSON.stringify(verse.content);\n verses.push({\n number: verse.number,\n text: text.trimEnd(),\n contentJson,\n });\n }\n }\n\n chapterUpsert.run({\n translationId: translation.id,\n bookId: book.id,\n number: chapter.chapter.number,\n json: JSON.stringify(chapter.chapter),\n });\n\n for (let verse of verses) {\n verseUpsert.run({\n translationId: translation.id,\n bookId: book.id,\n chapterNumber: chapter.chapter.number,\n number: verse.number,\n text: verse.text,\n contentJson: verse.contentJson,\n });\n }\n\n for (let footnote of footnotes.values()) {\n footnoteUpsert.run({\n translationId: translation.id,\n bookId: book.id,\n chapterNumber: chapter.chapter.number,\n id: footnote.id,\n verseNumber: footnote.verseNumber,\n text: footnote.text,\n });\n }\n\n for (let reader in chapter.thisChapterAudioLinks) {\n const url = chapter.thisChapterAudioLinks[reader];\n if (url) {\n chapterAudioUpsert.run({\n translationId: translation.id,\n bookId: book.id,\n number: chapter.chapter.number,\n reader: reader,\n url,\n });\n }\n }\n\n for (let reader in chapter.thisChapterAudioTimings) {\n const verses = chapter.thisChapterAudioTimings[reader];\n if (verses) {\n chapterAudioTimingUpsert.run({\n translationId: translation.id,\n bookId: book.id,\n number: chapter.chapter.number,\n reader: reader,\n timingsJson: JSON.stringify(verses),\n });\n }\n }\n\n if (chapter.thisChapterWords) {\n chapterWordsUpsert.run({\n translationId: translation.id,\n bookId: book.id,\n number: chapter.chapter.number,\n wordsJson: JSON.stringify(chapter.thisChapterWords),\n });\n }\n }\n });\n\n insertChaptersAndVerses();\n}\n\n/**\n * Inserts or updates the audio timing (per-verse start times, in seconds) for a chapter and reader.\n * @param db The database to insert the timing into.\n * @param translationId The ID of the translation.\n * @param bookId The ID of the book.\n * @param chapterNumber The number of the chapter.\n * @param reader The reader that the timing is for.\n * @param verses The times (in seconds) that each verse starts, in verse order.\n */\nexport function upsertChapterAudioTiming(\n db: Database,\n translationId: string,\n bookId: string,\n chapterNumber: number,\n reader: string,\n verses: number[]\n) {\n db.prepare(\n `INSERT INTO ChapterAudioTiming(\n translationId,\n bookId,\n number,\n reader,\n timingsJson\n ) VALUES (\n @translationId,\n @bookId,\n @number,\n @reader,\n @timingsJson\n ) ON CONFLICT(translationId,bookId,number,reader) DO\n UPDATE SET\n timingsJson=excluded.timingsJson;`\n ).run({\n translationId,\n bookId,\n number: chapterNumber,\n reader,\n timingsJson: JSON.stringify(verses),\n });\n}\n\n/**\n * Updates the hashes for the translations in the database.\n * @param db The database to update the hashes in.\n * @param translations The translations to update the hashes for.\n */\nfunction updateTranslationHashes(\n db: Database,\n translations: DatasetTranslation[]\n) {\n const logger = log.getLogger();\n logger.log(`Updating hashes for ${translations.length} translations.`);\n\n const updateTranslationHash = db.prepare(\n `UPDATE Translation SET sha256 = @sha256 WHERE id = @translationId;`\n );\n const updateBookHash = db.prepare(\n `UPDATE Book SET sha256 = @sha256 WHERE translationId = @translationId AND id = @bookId;`\n );\n const updateChapterHash = db.prepare(\n `UPDATE Chapter SET sha256 = @sha256 WHERE translationId = @translationId AND bookId = @bookId AND number = @chapterNumber;`\n );\n\n const getBooks = db.prepare('SELECT * FROM Book WHERE translationId = ?;');\n const getChapters = db.prepare(\n 'SELECT * FROM Chapter WHERE translationId = @translationId AND bookId = @bookId;'\n );\n\n for (let translation of translations) {\n const translationSha = sha256()\n .update(translation.id)\n .update(translation.name)\n .update(translation.language)\n .update(translation.licenseUrl)\n .update(translation.textDirection)\n .update(translation.website)\n .update(translation.englishName)\n .update(translation.shortName);\n\n const books = getBooks.all(translation.id) as {\n id: string;\n order: number;\n title: string;\n translationId: string;\n name: string;\n commonName: string;\n numberOfChapters: number;\n sha256: string;\n }[];\n\n for (let book of books) {\n const chapters = getChapters.all({\n translationId: translation.id,\n bookId: book.id,\n }) as {\n number: string;\n bookId: string;\n translationId: string;\n json: string;\n sha256: string;\n }[];\n\n const bookSha = sha256()\n .update(book.translationId)\n .update(book.id)\n .update(book.numberOfChapters)\n .update(book.order)\n .update(book.name)\n .update(book.title)\n .update(book.commonName);\n\n for (let chapter of chapters) {\n const hash = sha256()\n .update(chapter.translationId)\n .update(chapter.bookId)\n .update(chapter.number)\n .update(chapter.json)\n .digest('hex');\n\n chapter.sha256 = hash;\n\n bookSha.update(hash);\n }\n\n const updateChapters = db.transaction(() => {\n for (let chapter of chapters) {\n updateChapterHash.run({\n sha256: chapter.sha256,\n translationId: chapter.translationId,\n bookId: chapter.bookId,\n chapterNumber: chapter.number,\n });\n }\n });\n\n updateChapters();\n\n const bookHash = bookSha.digest('hex');\n book.sha256 = bookHash;\n\n translationSha.update(bookHash);\n }\n\n const updateBooks = db.transaction(() => {\n for (let book of books) {\n updateBookHash.run({\n sha256: book.sha256,\n translationId: book.translationId,\n bookId: book.id,\n });\n }\n });\n\n updateBooks();\n\n const hash = translationSha.digest('hex');\n (translation as any).sha256 = hash;\n }\n\n const updateTranslations = db.transaction(() => {\n for (let translation of translations) {\n updateTranslationHash.run({\n sha256: (translation as any).sha256,\n translationId: translation.id,\n });\n }\n });\n\n updateTranslations();\n\n logger.log(`Updated.`);\n}\n\nexport function insertCommentaries(\n db: Database,\n commentaries: DatasetCommentary[]\n) {\n const translationUpsert = db.prepare(`INSERT INTO Commentary(\n id,\n name,\n language,\n textDirection,\n licenseUrl,\n licenseNotes,\n website,\n englishName\n ) VALUES (\n @id,\n @name,\n @language,\n @textDirection,\n @licenseUrl,\n @licenseNotes,\n @website,\n @englishName\n ) ON CONFLICT(id) DO \n UPDATE SET\n name=excluded.name,\n language=excluded.language,\n textDirection=excluded.textDirection,\n licenseUrl=excluded.licenseUrl,\n licenseNotes=excluded.licenseNotes,\n website=excluded.website,\n englishName=excluded.englishName;`);\n\n const insertManyTranslations = db.transaction(\n (commentaries: DatasetCommentary[]) => {\n for (let commentary of commentaries) {\n translationUpsert.run({\n id: commentary.id,\n name: commentary.name,\n language: commentary.language,\n textDirection: commentary.textDirection,\n licenseUrl: commentary.licenseUrl,\n licenseNotes: commentary.licenseNotes,\n website: commentary.website,\n englishName: commentary.englishName,\n });\n }\n }\n );\n\n insertManyTranslations(commentaries);\n\n for (let commentary of commentaries) {\n insertCommentaryBooks(db, commentary, commentary.books);\n insertCommentaryProfiles(db, commentary, commentary.profiles);\n }\n}\n\nexport function insertCommentaryBooks(\n db: Database,\n commentary: DatasetCommentary,\n commentaryBooks: DatasetCommentaryBook[]\n) {\n const bookUpsert = db.prepare(`INSERT INTO CommentaryBook(\n id,\n commentaryId,\n introduction,\n introductionSummary,\n name,\n commonName,\n numberOfChapters,\n \\`order\\`\n ) VALUES (\n @id,\n @commentaryId,\n @introduction,\n @introductionSummary,\n @name,\n @commonName,\n @numberOfChapters,\n @bookOrder\n ) ON CONFLICT(id,commentaryId) DO \n UPDATE SET\n introduction=excluded.introduction,\n introductionSummary=excluded.introductionSummary,\n name=excluded.name,\n commonName=excluded.commonName,\n numberOfChapters=excluded.numberOfChapters;`);\n\n const insertMany = db.transaction((books: DatasetCommentaryBook[]) => {\n for (let book of books) {\n if (!book) {\n continue;\n }\n bookUpsert.run({\n id: book.id,\n commentaryId: commentary.id,\n introduction: book.introduction ?? null,\n introductionSummary: book.introductionSummary ?? null,\n name: book.name,\n commonName: book.commonName,\n numberOfChapters: book.chapters.length,\n bookOrder: book.order ?? 9999,\n });\n }\n });\n\n insertMany(commentaryBooks);\n\n for (let book of commentaryBooks) {\n insertCommentaryContent(db, commentary, book, book.chapters);\n }\n}\n\nexport function insertCommentaryProfiles(\n db: Database,\n commentary: DatasetCommentary,\n commentaryProfiles: DatasetCommentaryProfile[]\n) {\n const profileUpsert = db.prepare(`INSERT INTO CommentaryProfile(\n id,\n commentaryId,\n subject,\n content,\n referenceBook,\n referenceChapter,\n referenceVerse,\n referenceEndChapter,\n referenceEndVerse,\n json\n ) VALUES (\n @id,\n @commentaryId,\n @subject,\n @content,\n @referenceBook,\n @referenceChapter,\n @referenceVerse,\n @referenceEndChapter,\n @referenceEndVerse,\n @json\n ) ON CONFLICT(id,commentaryId) DO \n UPDATE SET\n subject=excluded.subject,\n content=excluded.content,\n referenceBook=excluded.referenceBook,\n referenceChapter=excluded.referenceChapter,\n referenceVerse=excluded.referenceVerse,\n referenceEndChapter=excluded.referenceEndChapter,\n referenceEndVerse=excluded.referenceEndVerse;`);\n\n const insertMany = db.transaction(\n (profiles: DatasetCommentaryProfile[]) => {\n for (let profile of profiles) {\n if (!profile) {\n continue;\n }\n profileUpsert.run({\n id: profile.id,\n commentaryId: commentary.id,\n subject: profile.subject,\n content: profile.content.join('\\n'),\n referenceBook: profile.reference?.book ?? null,\n referenceChapter: profile.reference?.chapter ?? null,\n referenceVerse: profile.reference?.verse ?? null,\n referenceEndChapter: profile.reference?.endChapter ?? null,\n referenceEndVerse: profile.reference?.endVerse ?? null,\n json: JSON.stringify(profile),\n });\n }\n }\n );\n\n insertMany(commentaryProfiles);\n}\n\nexport function insertCommentaryContent(\n db: Database,\n commentary: DatasetCommentary,\n book: DatasetCommentaryBook,\n chapters: CommentaryBookChapter[]\n) {\n const logger = log.getLogger();\n\n const chapterUpsert = db.prepare(`INSERT INTO CommentaryChapter(\n commentaryId,\n bookId,\n number,\n introduction,\n json\n ) VALUES (\n @commentaryId,\n @bookId,\n @number,\n @introduction,\n @json\n ) ON CONFLICT(commentaryId,bookId,number) DO \n UPDATE SET\n introduction=excluded.introduction,\n json=excluded.json;`);\n const verseUpsert = db.prepare(`INSERT INTO CommentaryChapterVerse(\n commentaryId,\n bookId,\n chapterNumber,\n number,\n text,\n contentJson\n ) VALUES (\n @commentaryId,\n @bookId,\n @chapterNumber,\n @number,\n @text,\n @contentJson\n ) ON CONFLICT(commentaryId,bookId,chapterNumber,number) DO \n UPDATE SET\n text=excluded.text,\n contentJson=excluded.contentJson;`);\n\n const insertChaptersAndVerses = db.transaction(() => {\n for (let chapter of chapters) {\n let verses: {\n number: number;\n text: string;\n contentJson: string;\n }[] = [];\n\n for (let c of chapter.chapter.content) {\n if (c.type === 'verse') {\n const verse: ChapterVerse = c;\n if (!verse.number) {\n logger.error(\n 'Verse missing number',\n commentary.id,\n book.id,\n chapter.chapter.number,\n verse.number\n );\n continue;\n }\n\n let text = '';\n for (let c of verse.content) {\n if (typeof c === 'string') {\n text += c + ' ';\n } else if (typeof c === 'object') {\n if ('lineBreak' in c) {\n text += '\\n';\n } else if ('text' in c) {\n text += c.text + ' ';\n }\n }\n }\n\n let contentJson = JSON.stringify(verse.content);\n verses.push({\n number: verse.number,\n text: text.trimEnd(),\n contentJson,\n });\n }\n }\n\n chapterUpsert.run({\n commentaryId: commentary.id,\n bookId: book.id,\n number: chapter.chapter.number,\n introduction: chapter.chapter.introduction ?? null,\n json: JSON.stringify(chapter.chapter),\n });\n\n for (let verse of verses) {\n verseUpsert.run({\n commentaryId: commentary.id,\n bookId: book.id,\n chapterNumber: chapter.chapter.number,\n number: verse.number,\n text: verse.text,\n contentJson: verse.contentJson,\n });\n }\n }\n });\n\n insertChaptersAndVerses();\n}\n\n/**\n * Updates the hashes for the commentaries in the database.\n * @param db The database to update the hashes in.\n * @param commentaries The commentaries to update the hashes for.\n */\nfunction updateCommentaryHashes(\n db: Database,\n commentaries: DatasetCommentary[]\n) {\n const logger = log.getLogger();\n logger.log(`Updating hashes for ${commentaries.length} commentaries.`);\n\n const updateTranslationHash = db.prepare(\n `UPDATE Commentary SET sha256 = @sha256 WHERE id = @commentaryId;`\n );\n const updateBookHash = db.prepare(\n `UPDATE CommentaryBook SET sha256 = @sha256 WHERE commentaryId = @commentaryId AND id = @bookId;`\n );\n const updateChapterHash = db.prepare(\n `UPDATE CommentaryChapter SET sha256 = @sha256 WHERE commentaryId = @commentaryId AND bookId = @bookId AND number = @chapterNumber;`\n );\n\n const getBooks = db.prepare(\n 'SELECT * FROM CommentaryBook WHERE commentaryId = ?;'\n );\n const getChapters = db.prepare(\n 'SELECT * FROM CommentaryChapter WHERE commentaryId = @commentaryId AND bookId = @bookId;'\n );\n\n const updateProfileHash = db.prepare(\n `UPDATE CommentaryProfile SET sha256 = @sha256 WHERE commentaryId = @commentaryId AND id = @profileId;`\n );\n\n const getProfiles = db.prepare(\n 'SELECT * FROM CommentaryProfile WHERE commentaryId = ?;'\n );\n\n for (let commentary of commentaries) {\n const commentarySha = sha256()\n .update(commentary.id)\n .update(commentary.name)\n .update(commentary.language)\n .update(commentary.licenseUrl)\n .update(commentary.textDirection)\n .update(commentary.website)\n .update(commentary.englishName);\n\n const books = getBooks.all(commentary.id) as {\n id: string;\n order: number;\n title: string;\n commentaryId: string;\n name: string;\n commonName: string;\n numberOfChapters: number;\n sha256: string;\n introduction: string;\n }[];\n\n for (let book of books) {\n const chapters = getChapters.all({\n commentaryId: commentary.id,\n bookId: book.id,\n }) as {\n number: string;\n bookId: string;\n commentaryId: string;\n introduction: string;\n json: string;\n sha256: string;\n }[];\n\n const bookSha = sha256()\n .update(book.commentaryId)\n .update(book.id)\n .update(book.numberOfChapters)\n .update(book.order)\n .update(book.name)\n .update(book.title)\n .update(book.commonName)\n .update(book.introduction);\n\n for (let chapter of chapters) {\n const hash = sha256()\n .update(chapter.commentaryId)\n .update(chapter.bookId)\n .update(chapter.number)\n .update(chapter.introduction)\n .update(chapter.json)\n .digest('hex');\n\n chapter.sha256 = hash;\n\n bookSha.update(hash);\n }\n\n const updateChapters = db.transaction(() => {\n for (let chapter of chapters) {\n updateChapterHash.run({\n sha256: chapter.sha256,\n commentaryId: chapter.commentaryId,\n bookId: chapter.bookId,\n chapterNumber: chapter.number,\n });\n }\n });\n\n updateChapters();\n\n const bookHash = bookSha.digest('hex');\n book.sha256 = bookHash;\n\n commentarySha.update(bookHash);\n }\n\n const updateBooks = db.transaction(() => {\n for (let book of books) {\n updateBookHash.run({\n sha256: book.sha256,\n commentaryId: book.commentaryId,\n bookId: book.id,\n });\n }\n });\n\n updateBooks();\n\n const profiles = getProfiles.all(commentary.id) as {\n id: string;\n commentaryId: string;\n subject: string;\n content: string;\n referenceBook: string | null;\n referenceChapter: number | null;\n referenceVerse: number | null;\n referenceEndChapter: number | null;\n referenceEndVerse: number | null;\n sha256: string;\n }[];\n\n for (let profile of profiles) {\n const profileSha = sha256()\n .update(profile.commentaryId)\n .update(profile.id)\n .update(profile.subject)\n .update(profile.content)\n .update(profile.referenceBook)\n .update(profile.referenceChapter)\n .update(profile.referenceVerse)\n .update(profile.referenceEndChapter)\n .update(profile.referenceEndVerse);\n\n profile.sha256 = profileSha.digest('hex');\n }\n\n const updateProfiles = db.transaction(() => {\n for (let profile of profiles) {\n updateProfileHash.run({\n sha256: profile.sha256,\n commentaryId: profile.commentaryId,\n profileId: profile.id,\n });\n }\n });\n\n updateProfiles();\n\n const hash = commentarySha.digest('hex');\n (commentary as any).sha256 = hash;\n }\n\n const updateCommentaries = db.transaction(() => {\n for (let commentary of commentaries) {\n updateTranslationHash.run({\n sha256: (commentary as any).sha256,\n commentaryId: commentary.id,\n });\n }\n });\n\n updateCommentaries();\n\n logger.log(`Updated.`);\n}\n\nexport function insertDatasets(db: Database, datasets: DatasetDataset[]) {\n const translationUpsert = db.prepare(`INSERT INTO Dataset(\n id,\n name,\n language,\n textDirection,\n licenseUrl,\n licenseNotes,\n website,\n englishName\n ) VALUES (\n @id,\n @name,\n @language,\n @textDirection,\n @licenseUrl,\n @licenseNotes,\n @website,\n @englishName\n ) ON CONFLICT(id) DO \n UPDATE SET\n name=excluded.name,\n language=excluded.language,\n textDirection=excluded.textDirection,\n licenseUrl=excluded.licenseUrl,\n licenseNotes=excluded.licenseNotes,\n website=excluded.website,\n englishName=excluded.englishName;`);\n\n const insertManyTranslations = db.transaction(\n (datasets: DatasetDataset[]) => {\n for (let dataset of datasets) {\n translationUpsert.run({\n id: dataset.id,\n name: dataset.name,\n language: dataset.language,\n textDirection: dataset.textDirection,\n licenseUrl: dataset.licenseUrl,\n licenseNotes: dataset.licenseNotes,\n website: dataset.website,\n englishName: dataset.englishName,\n });\n }\n }\n );\n\n insertManyTranslations(datasets);\n\n const deleteReferences = db.prepare(`DELETE FROM DatasetReference\n WHERE datasetId = @datasetId;`);\n\n for (let dataset of datasets) {\n deleteReferences.run({\n datasetId: dataset.id,\n });\n insertDatasetBooks(db, dataset, dataset.books);\n }\n}\n\nexport function insertDatasetBooks(\n db: Database,\n dataset: DatasetDataset,\n datasetBooks: DatasetDatasetBook[]\n) {\n const bookUpsert = db.prepare(`INSERT INTO DatasetBook(\n id,\n datasetId,\n numberOfChapters,\n \\`order\\`\n ) VALUES (\n @id,\n @datasetId,\n @numberOfChapters,\n @bookOrder\n ) ON CONFLICT(id,datasetId) DO \n UPDATE SET\n numberOfChapters=excluded.numberOfChapters;`);\n\n const insertMany = db.transaction((books: DatasetDatasetBook[]) => {\n for (let book of books) {\n if (!book) {\n continue;\n }\n bookUpsert.run({\n id: book.id,\n datasetId: dataset.id,\n numberOfChapters: book.chapters.length,\n bookOrder: book.order ?? 9999,\n });\n }\n });\n\n insertMany(datasetBooks);\n\n for (let book of datasetBooks) {\n insertDatasetContent(db, dataset, book, book.chapters);\n }\n}\n\nexport function insertDatasetContent(\n db: Database,\n dataset: DatasetDataset,\n book: DatasetDatasetBook,\n chapters: DatasetBookChapter[]\n) {\n const logger = log.getLogger();\n\n const chapterUpsert = db.prepare(`INSERT INTO DatasetChapter(\n datasetId,\n bookId,\n number,\n json\n ) VALUES (\n @datasetId,\n @bookId,\n @number,\n @json\n ) ON CONFLICT(datasetId,bookId,number) DO \n UPDATE SET\n json=excluded.json;`);\n const verseUpsert = db.prepare(`INSERT INTO DatasetChapterVerse(\n datasetId,\n bookId,\n chapterNumber,\n number,\n contentJson\n ) VALUES (\n @datasetId,\n @bookId,\n @chapterNumber,\n @number,\n @contentJson\n ) ON CONFLICT(datasetId,bookId,chapterNumber,number) DO \n UPDATE SET\n contentJson=excluded.contentJson;`);\n\n const referenceInsert = db.prepare(`INSERT INTO DatasetReference(\n datasetId,\n bookId,\n chapterNumber,\n verseNumber,\n referenceBookId,\n referenceChapter,\n referenceVerse,\n endVerseNumber,\n score\n ) VALUES (\n @datasetId,\n @bookId,\n @chapterNumber,\n @verseNumber,\n @referenceBookId,\n @referenceChapter,\n @referenceVerse,\n @endVerseNumber,\n @score\n );`);\n\n const insertChaptersAndVerses = db.transaction(() => {\n for (let chapter of chapters) {\n chapterUpsert.run({\n datasetId: dataset.id,\n bookId: book.id,\n number: chapter.chapter.number,\n json: JSON.stringify(chapter.chapter),\n });\n\n for (let verse of chapter.chapter.content) {\n verseUpsert.run({\n datasetId: dataset.id,\n bookId: book.id,\n chapterNumber: chapter.chapter.number,\n number: verse.verse,\n contentJson: JSON.stringify(verse),\n });\n\n for (let ref of verse.references) {\n referenceInsert.run({\n datasetId: dataset.id,\n bookId: book.id,\n chapterNumber: chapter.chapter.number,\n verseNumber: verse.verse,\n referenceBookId: ref.book,\n referenceChapter: ref.chapter,\n referenceVerse: ref.verse,\n endVerseNumber: ref.endVerse ?? null,\n score: ref.score ?? null,\n });\n }\n }\n }\n });\n\n insertChaptersAndVerses();\n}\n\n/**\n * Updates the hashes for the datasets in the database.\n * @param db The database to update the hashes in.\n * @param datasets The datasets to update the hashes for.\n */\nfunction updateDatasetHashes(db: Database, datasets: Dataset[]) {\n const logger = log.getLogger();\n logger.log(`Updating hashes for ${datasets.length} datasets.`);\n\n const updateTranslationHash = db.prepare(\n `UPDATE Dataset SET sha256 = @sha256 WHERE id = @datasetId;`\n );\n const updateBookHash = db.prepare(\n `UPDATE DatasetBook SET sha256 = @sha256 WHERE datasetId = @datasetId AND id = @bookId;`\n );\n const updateChapterHash = db.prepare(\n `UPDATE DatasetChapter SET sha256 = @sha256 WHERE datasetId = @datasetId AND bookId = @bookId AND number = @chapterNumber;`\n );\n\n const getBooks = db.prepare(\n 'SELECT * FROM DatasetBook WHERE datasetId = ?;'\n );\n const getChapters = db.prepare(\n 'SELECT * FROM DatasetChapter WHERE datasetId = @datasetId AND bookId = @bookId;'\n );\n\n for (let dataset of datasets) {\n const commentarySha = sha256()\n .update(dataset.id)\n .update(dataset.name)\n .update(dataset.language)\n .update(dataset.licenseUrl)\n .update(dataset.textDirection)\n .update(dataset.website)\n .update(dataset.englishName);\n\n const books = getBooks.all(dataset.id) as {\n id: string;\n datasetId: string;\n order: number;\n numberOfChapters: number;\n sha256: string;\n }[];\n\n for (let book of books) {\n const chapters = getChapters.all({\n datasetId: dataset.id,\n bookId: book.id,\n }) as {\n number: string;\n bookId: string;\n datasetId: string;\n json: string;\n sha256: string;\n }[];\n\n const bookSha = sha256()\n .update(book.datasetId)\n .update(book.id)\n .update(book.numberOfChapters)\n .update(book.order);\n\n for (let chapter of chapters) {\n const hash = sha256()\n .update(chapter.datasetId)\n .update(chapter.bookId)\n .update(chapter.number)\n .update(chapter.json)\n .digest('hex');\n\n chapter.sha256 = hash;\n\n bookSha.update(hash);\n }\n\n const updateChapters = db.transaction(() => {\n for (let chapter of chapters) {\n updateChapterHash.run({\n sha256: chapter.sha256,\n datasetId: chapter.datasetId,\n bookId: chapter.bookId,\n chapterNumber: chapter.number,\n });\n }\n });\n\n updateChapters();\n\n const bookHash = bookSha.digest('hex');\n book.sha256 = bookHash;\n\n commentarySha.update(bookHash);\n }\n\n const updateBooks = db.transaction(() => {\n for (let book of books) {\n updateBookHash.run({\n sha256: book.sha256,\n datasetId: book.datasetId,\n bookId: book.id,\n });\n }\n });\n\n updateBooks();\n\n const hash = commentarySha.digest('hex');\n (dataset as any).sha256 = hash;\n }\n\n const updateDatasets = db.transaction(() => {\n for (let dataset of datasets) {\n updateTranslationHash.run({\n sha256: (dataset as any).sha256,\n datasetId: dataset.id,\n });\n }\n });\n\n updateDatasets();\n\n logger.log(`Updated.`);\n}\n\nexport function getDbPathFromDir(dir: string) {\n dir = dir || process.cwd();\n return path.resolve(dir, 'bible-api.db');\n}\n\nexport function getDbPath(p?: string | null) {\n if (p) {\n return path.resolve(p);\n }\n return getDbPathFromDir(process.cwd());\n}\n\nexport async function getPrismaDb(path?: string | null) {\n const db = await getDb(path);\n db.close();\n const dbPath = getDbPath(path);\n console.log('Opening database at', dbPath);\n const prisma = new PrismaClient({\n adapter: new PrismaBetterSqlite3({\n url: 'file:' + dbPath,\n }),\n });\n return prisma;\n}\n\n/**\n * Gets the database from the given path. If no path is provided, the current working directory is used.\n * @param path The path to the database. If not provided, the current working directory is used.\n * @returns\n */\nexport async function getDb(path?: string | null): Promise<Database> {\n const dbPath = getDbPath(path);\n const db = await getDbFromPath(dbPath);\n return db;\n}\n\nasync function getDbFromPath(dbPath: string): Promise<Database> {\n console.log('Opening database at', dbPath);\n const logger = log.getLogger();\n const migrationsPath = await getMigrationsPath();\n if (!migrationsPath) {\n throw new Error('Could not find migrations path');\n }\n\n const db = new Sql(dbPath, {});\n\n db.exec(`CREATE TABLE IF NOT EXISTS \"_prisma_migrations\" (\n \"id\" TEXT PRIMARY KEY NOT NULL,\n \"checksum\" TEXT NOT NULL,\n \"finished_at\" DATETIME,\n \"migration_name\" TEXT NOT NULL,\n \"logs\" TEXT,\n \"rolled_back_at\" DATETIME,\n \"started_at\" DATETIME NOT NULL DEFAULT current_timestamp,\n \"applied_steps_count\" INTEGER UNSIGNED NOT NULL DEFAULT 0\n );`);\n\n const migrations = await readdir(migrationsPath);\n const appliedMigrations = db\n .prepare('SELECT * FROM _prisma_migrations;')\n .all() as Migration[];\n\n let missingMigrations = [];\n for (let migration of migrations) {\n if (appliedMigrations.some((m) => m.migration_name === migration)) {\n continue;\n }\n if (path.extname(migration) !== '') {\n continue;\n }\n missingMigrations.push(migration);\n }\n\n const insertMigrationStatement = db.prepare(\n 'INSERT INTO _prisma_migrations (id, checksum, started_at, finished_at, migration_name, applied_steps_count, logs, rolled_back_at) VALUES (?, ?, ?, ?, ?, ?, NULL, NULL);'\n );\n\n for (let missingMigration of missingMigrations) {\n logger.log(`Applying migration ${missingMigration}...`);\n const migration = path.resolve(\n migrationsPath,\n missingMigration,\n 'migration.sql'\n );\n const migrationFile = await readFile(migration, 'utf8');\n db.exec(migrationFile);\n insertMigrationStatement.run(\n randomUUID(),\n '',\n new Date().toISOString(),\n new Date().toISOString(),\n missingMigration,\n 1\n );\n }\n\n return db;\n}\n\ninterface Migration {\n id: string;\n checksum: string;\n finished_at: Date;\n migration_name: string;\n}\n\nexport interface SerializedFile {\n path: string;\n content: string | Readable;\n\n /**\n * Gets the base64-encoded SHA256 hash of the content of the file.\n */\n sha256?(): string;\n}\n\n/**\n * Loads the datasets from the database in a series of batches.\n * @param db The database.\n * @param perBatch The number of translations to load per batch.\n * @param translationsToLoad The list of translations/commentaries to load. If not provided, all translations will be loaded.\n */\nexport async function* loadDatasets(\n db: PrismaClient,\n perBatch: number = 50,\n translationsToLoad?: string[]\n): AsyncGenerator<DatasetOutput> {\n yield* loadTranslationDatasets(db, perBatch, translationsToLoad);\n yield* loadCommentaryDatasets(db, perBatch, translationsToLoad);\n yield* loadDatasetDatasets(db, perBatch, translationsToLoad);\n}\n\n/**\n * Loads the translations from the database as a dataset.\n * @param db The database.\n * @param translationsPerBatch The number of translations to load per batch.\n * @param translationsToLoad The list of translations to load. If not provided, all translations will be loaded.\n */\nexport async function* loadTranslationDatasets(\n db: PrismaClient,\n translationsPerBatch: number = 50,\n translationsToLoad?: string[]\n) {\n const logger = log.getLogger();\n let offset = 0;\n let pageSize = translationsPerBatch;\n\n logger.log('Generating translation datasets in batches of', pageSize);\n const totalTranslations = await db.translation.count();\n const totalBatches = Math.ceil(totalTranslations / pageSize);\n let batchNumber = 1;\n\n while (true) {\n logger.log(\n 'Generating translation batch',\n batchNumber,\n 'of',\n totalBatches\n );\n batchNumber++;\n\n const translationQuery: Prisma.TranslationFindManyArgs = {\n skip: offset,\n take: pageSize,\n };\n const commentaryQuery: Prisma.CommentaryFindManyArgs = {\n skip: offset,\n take: pageSize,\n };\n\n if (translationsToLoad && translationsToLoad.length > 0) {\n translationQuery.where = {\n id: {\n in: translationsToLoad,\n },\n };\n commentaryQuery.where = {\n id: {\n in: translationsToLoad,\n },\n };\n }\n\n const translations = await db.translation.findMany(translationQuery);\n const commentaries = await db.commentary.findMany(commentaryQuery);\n\n if (translations.length <= 0) {\n break;\n }\n\n const dataset: DatasetOutput = {\n translations: [],\n commentaries: [],\n };\n\n const optionalTranslationKeys: (keyof DatasetTranslation)[] = [\n 'licenseNotes',\n 'licenseNotice',\n ];\n\n for (let translation of translations) {\n const datasetTranslation: DatasetTranslation = {\n ...translation,\n shortName: translation.shortName!,\n textDirection: translation.textDirection! as any,\n books: [],\n };\n for (let key of optionalTranslationKeys) {\n if (!datasetTranslation[key]) {\n delete datasetTranslation[key];\n }\n }\n\n dataset.translations.push(datasetTranslation);\n\n const books = await db.book.findMany({\n where: {\n translationId: translation.id,\n },\n orderBy: {\n order: 'asc',\n },\n });\n\n for (let book of books) {\n const chapters = await db.chapter.findMany({\n where: {\n translationId: translation.id,\n bookId: book.id,\n },\n orderBy: {\n number: 'asc',\n },\n });\n\n const audioLinks = await db.chapterAudioUrl.findMany({\n where: {\n translationId: translation.id,\n bookId: book.id,\n },\n orderBy: [{ number: 'asc' }, { reader: 'asc' }],\n });\n\n const audioTimings = await db.chapterAudioTiming.findMany({\n where: {\n translationId: translation.id,\n bookId: book.id,\n },\n orderBy: [{ number: 'asc' }, { reader: 'asc' }],\n });\n\n const chapterWords = await db.chapterWords.findMany({\n where: {\n translationId: translation.id,\n bookId: book.id,\n },\n orderBy: [{ number: 'asc' }],\n });\n\n const bookChapters: TranslationBookChapter[] = chapters.map(\n (chapter) => {\n const words = chapterWords.find(\n (words) => words.number === chapter.number\n );\n\n return {\n chapter: JSON.parse(chapter.json),\n thisChapterAudioLinks: audioLinks\n .filter(\n (link) => link.number === chapter.number\n )\n .reduce((acc, link) => {\n acc[link.reader] = link.url;\n return acc;\n }, {} as any),\n thisChapterAudioTimings: audioTimings\n .filter(\n (timing) => timing.number === chapter.number\n )\n .reduce((acc, timing) => {\n acc[timing.reader] = JSON.parse(\n timing.timingsJson\n );\n return acc;\n }, {} as any),\n ...(words\n ? {\n thisChapterWords: JSON.parse(\n words.wordsJson\n ),\n }\n : {}),\n };\n }\n );\n\n const datasetBook: DatasetTranslationBook = {\n ...book,\n id: book.id as BookId,\n chapters: bookChapters,\n isApocryphal: book.isApocryphal ?? false,\n };\n if (!datasetBook.isApocryphal) {\n delete datasetBook.isApocryphal;\n }\n datasetTranslation.books.push(datasetBook);\n }\n }\n\n yield dataset;\n\n offset += pageSize;\n }\n}\n\n/**\n * Loads the commentaries from the database as a dataset.\n * @param db The database.\n * @param perBatch The number of translations to load per batch.\n * @param commentariesToLoad The list of commentaries to load. If not provided, all commentaries will be loaded.\n */\nexport async function* loadCommentaryDatasets(\n db: PrismaClient,\n perBatch: number = 50,\n commentariesToLoad?: string[]\n) {\n const logger = log.getLogger();\n let offset = 0;\n let pageSize = perBatch;\n\n logger.log('Generating commentaries datasets in batches of', pageSize);\n const totalCommentaries = await db.commentary.count();\n const totalBatches = Math.ceil(totalCommentaries / pageSize);\n let batchNumber = 1;\n\n while (true) {\n logger.log(\n 'Generating commentary batch',\n batchNumber,\n 'of',\n totalBatches\n );\n batchNumber++;\n\n const commentaryQuery: Prisma.CommentaryFindManyArgs = {\n skip: offset,\n take: pageSize,\n };\n\n if (commentariesToLoad && commentariesToLoad.length > 0) {\n commentaryQuery.where = {\n id: {\n in: commentariesToLoad,\n },\n };\n }\n\n const commentaries = await db.commentary.findMany(commentaryQuery);\n\n if (commentaries.length <= 0) {\n break;\n }\n\n const dataset: DatasetOutput = {\n translations: [],\n commentaries: [],\n };\n\n for (let commentary of commentaries) {\n const datasetCommentary: DatasetCommentary = {\n ...commentary,\n textDirection: commentary.textDirection! as any,\n books: [],\n profiles: [],\n };\n dataset.commentaries.push(datasetCommentary);\n\n const books = await db.commentaryBook.findMany({\n where: {\n commentaryId: commentary.id,\n },\n orderBy: {\n order: 'asc',\n },\n });\n\n for (let book of books) {\n const chapters = await db.commentaryChapter.findMany({\n where: {\n commentaryId: commentary.id,\n bookId: book.id,\n },\n orderBy: {\n number: 'asc',\n },\n });\n\n const bookChapters: CommentaryBookChapter[] = chapters.map(\n (chapter) => {\n return {\n chapter: JSON.parse(chapter.json),\n };\n }\n );\n\n const datasetBook: DatasetCommentaryBook = {\n ...book,\n id: book.id as BookId,\n introduction: book.introduction ?? undefined,\n introductionSummary: book.introductionSummary ?? undefined,\n chapters: bookChapters,\n };\n datasetCommentary.books.push(datasetBook);\n }\n\n const profiles = await db.commentaryProfile.findMany({\n where: {\n commentaryId: commentary.id,\n },\n orderBy: {\n id: 'asc',\n },\n });\n\n for (let profile of profiles) {\n const json = profile.json;\n datasetCommentary.profiles.push(JSON.parse(json));\n }\n }\n\n yield dataset;\n\n offset += pageSize;\n }\n}\n\n/**\n * Loads the datasets from the database as a dataset.\n * @param db The database.\n * @param perBatch The number of translations to load per batch.\n * @param datasetsToLoad The list of commentaries to load. If not provided, all commentaries will be loaded.\n */\nexport async function* loadDatasetDatasets(\n db: PrismaClient,\n perBatch: number = 50,\n datasetsToLoad?: string[]\n) {\n const logger = log.getLogger();\n let offset = 0;\n let pageSize = perBatch;\n\n logger.log('Generating dataset datasets in batches of', pageSize);\n const totalDatasets = await db.dataset.count();\n const totalBatches = Math.ceil(totalDatasets / pageSize);\n let batchNumber = 1;\n\n while (true) {\n logger.log('Generating dataset batch', batchNumber, 'of', totalBatches);\n batchNumber++;\n\n const datasetQuery: Prisma.DatasetFindManyArgs = {\n skip: offset,\n take: pageSize,\n };\n\n if (datasetsToLoad && datasetsToLoad.length > 0) {\n datasetQuery.where = {\n id: {\n in: datasetsToLoad,\n },\n };\n }\n\n const datasets = await db.dataset.findMany(datasetQuery);\n\n if (datasets.length <= 0) {\n break;\n }\n\n const output: DatasetOutput = {\n translations: [],\n commentaries: [],\n datasets: [],\n };\n\n for (let dataset of datasets) {\n const datasetDataset: DatasetDataset = {\n ...dataset,\n textDirection: dataset.textDirection! as any,\n books: [],\n };\n output.datasets!.push(datasetDataset);\n\n const books = await db.datasetBook.findMany({\n where: {\n datasetId: dataset.id,\n },\n orderBy: {\n order: 'asc',\n },\n });\n\n for (let book of books) {\n const chapters = await db.datasetChapter.findMany({\n where: {\n datasetId: dataset.id,\n bookId: book.id,\n },\n orderBy: {\n number: 'asc',\n },\n });\n\n const bookChapters: DatasetBookChapter[] = chapters.map(\n (chapter) => {\n const bookChapter: DatasetBookChapter = {\n chapter: JSON.parse(chapter.json),\n };\n\n for (let verse of bookChapter.chapter.content) {\n verse.references.sort((a, b) => b.score - a.score);\n }\n\n return bookChapter;\n }\n );\n\n const datasetBook: DatasetDatasetBook = {\n ...book,\n id: book.id as BookId,\n chapters: bookChapters,\n };\n datasetDataset.books.push(datasetBook);\n }\n }\n\n yield output;\n\n offset += pageSize;\n }\n}\n\nexport interface SerializeApiOptions extends GenerateApiOptions {\n /**\n * Whether the output should be pretty-printed.\n */\n pretty?: boolean;\n}\n\n/**\n * Generates and serializes the API files for the datasets that are stored in the database.\n * Yields each batch of serialized files.\n * @param db The database that the dataset should be loaded from.\n * @param options The options to use for serializing the files.\n * @param apiOptions The options to use for generating the API files.\n * @param translationsPerBatch The number of translations that should be loaded and written per batch.\n * @param translations The list of translations that should be loaded. If not provided, all translations will be loaded.\n */\nexport function serializeFilesFromDatabase(\n db: PrismaClient,\n options: SerializeApiOptions = {},\n translationsPerBatch: number = 25,\n translations?: string[]\n): AsyncGenerator<SerializedFile[]> {\n return serializeDatasets(\n loadDatasets(db, translationsPerBatch, translations),\n options\n );\n}\n\n/**\n * Generates and serializes the API files for the given datasets.\n * Yields each batch of serialized files.\n *\n * @param datasets The datasets to serialize.\n * @param options The options to use for generating and serializing the files.\n */\nexport function serializeDatasets(\n datasets: AsyncIterable<DatasetOutput>,\n options: SerializeApiOptions = {}\n): AsyncGenerator<SerializedFile[]> {\n return serializeOutputFiles(\n generateOutputFilesFromDatasets(datasets, {\n getEnglishName: getEnglishName,\n getNativeName: getNativeName,\n ...options,\n }),\n options\n );\n}\n\nfunction insertWarningMetadata(\n db: Database,\n parseMessages: DatasetOutput['parseMessages'] | undefined\n) {\n if (!parseMessages) return;\n\n const logger = log.getLogger();\n\n const insertStatement = db.prepare(\n 'INSERT INTO InputFileWarning (name, type, message) VALUES (?, ?, ?) ON CONFLICT (name, type, message) DO NOTHING;'\n );\n for (const [fileName, messages] of Object.entries(parseMessages)) {\n for (const message of messages) {\n logger.warn(`Warning in file ${fileName}: ${message.message}`);\n insertStatement.run(fileName, message.type, message.message);\n }\n }\n}\n", "import {\r\n FileHandle,\r\n mkdir,\r\n open,\r\n readFile,\r\n readdir,\r\n writeFile,\r\n} from 'fs/promises';\r\nimport { basename, extname } from 'path';\r\nimport * as path from 'path';\r\nimport fsExtra from 'fs-extra';\r\nconst { existsSync } = fsExtra;\r\nimport {\r\n InputFile,\r\n InputTranslationMetadata,\r\n OutputFile,\r\n OutputFileContent,\r\n InputCommentaryMetadata,\r\n InputFileMetadata,\r\n InputTranslationFile,\r\n TranslationBookChapterWords,\r\n CommentaryBookChapterSchema,\r\n CommentaryBookChapter,\r\n} from '@helloao/tools/generation/common-types.js';\r\nimport { ZipWriter, Writer, TextReader, Reader } from '@zip.js/zip.js';\r\nimport { Readable, Writable } from 'stream';\r\nimport hash from 'hash.js';\r\nconst { sha256 } = hash;\r\nimport { PARSER_VERSION } from '@helloao/tools/parser/usx-parser.js';\r\nimport { mergeWith } from 'es-toolkit/compat';\r\nimport { fromByteArray } from 'base64-js';\r\nimport { log } from '@helloao/tools';\r\nimport { bookOrderMap } from '@helloao/tools/generation/book-order.js';\r\nimport {\r\n DATASET_VERSION,\r\n DatasetCommentary,\r\n DatasetCommentaryBook,\r\n DatasetDataset,\r\n DatasetDatasetBook,\r\n DatasetTranslation,\r\n DatasetTranslationBook,\r\n} from '@helloao/tools/generation/dataset.js';\r\nimport { getBookId } from '@helloao/tools/utils.js';\r\nimport { LOCKMAN_PARSER_VERSION } from '@helloao/tools/parser/lockman-parser.js';\r\nimport {\r\n ApiAvailableCommentaries,\r\n ApiAvailableCommentariesSchema,\r\n ApiAvailableTranslations,\r\n ApiCommentaryBookChapter,\r\n ApiCommentaryBookChapterSchema,\r\n ApiCommentaryBooks,\r\n ApiCommentaryBooksSchema,\r\n ApiCommentaryProfileContent,\r\n ApiCommentaryProfileContentSchema,\r\n ApiCommentaryProfiles,\r\n ApiCommentaryProfilesSchema,\r\n ApiTranslationBooks,\r\n ApiTranslationBookChapter,\r\n ApiTranslationBookChapterWords,\r\n replaceSpacesWithUnderscores,\r\n} from '@helloao/tools/generation/api.js';\r\nimport { ZodType } from 'zod';\r\n\r\n/**\r\n * Defines an interface that contains information about a serialized file.\r\n */\r\nexport interface Uploader {\r\n /**\r\n * Gets the ideal batch size for the uploader.\r\n * Null if the uploader does not need batching.\r\n */\r\n idealBatchSize: number | null;\r\n\r\n /**\r\n * Uploads the given file.\r\n * @param file The file to upload.\r\n * @param overwrite Whether the file should be overwritten if it already exists.\r\n * @returns True if the file was uploaded. False if the file was skipped due to already existing.\r\n */\r\n upload(file: SerializedFile, overwrite: boolean): Promise<boolean>;\r\n\r\n /**\r\n * Disposes resources that the uploader uses.\r\n */\r\n dispose?(): Promise<void>;\r\n}\r\n\r\n/**\r\n * Defines an interface for a file that has been serialized.\r\n */\r\nexport interface SerializedFile {\r\n path: string;\r\n content: string | Readable;\r\n\r\n /**\r\n * Gets the base64-encoded SHA256 hash of the content of the file.\r\n */\r\n sha256?(): string;\r\n}\r\n\r\n/**\r\n * The options for serializing API files.\r\n */\r\nexport interface SerializeApiOptions {\r\n /**\r\n * Whether the output should be pretty-printed.\r\n */\r\n pretty?: boolean;\r\n}\r\n\r\n/**\r\n * Serializes the given output files into serialized files using the given options.\r\n *\r\n * Each iteration of the given files will be processed as a batch, and any mergable files will automatically be merged together and serialized in the final batch.\r\n *\r\n * @param files The files that should be serialized.\r\n * @param options The options for serialization.\r\n */\r\nexport async function* serializeOutputFiles(\r\n files: AsyncIterable<OutputFile[]>,\r\n options: SerializeApiOptions\r\n): AsyncGenerator<SerializedFile[]> {\r\n const mergableFiles = new Map<string, OutputFile[]>();\r\n for await (let batch of files) {\r\n let serializedFiles: SerializedFile[] = [];\r\n for (let file of batch) {\r\n if (file.mergable) {\r\n let arr = mergableFiles.get(file.path);\r\n if (!arr) {\r\n arr = [];\r\n mergableFiles.set(file.path, arr);\r\n }\r\n arr.push(file);\r\n continue;\r\n }\r\n\r\n const serialized = await serializeFile(\r\n file.path,\r\n file.content,\r\n options\r\n );\r\n if (serialized) {\r\n serializedFiles.push(serialized);\r\n }\r\n }\r\n\r\n yield serializedFiles;\r\n }\r\n\r\n let serializedFiles: SerializedFile[] = [];\r\n for (let [path, files] of mergableFiles) {\r\n let content: object = {};\r\n for (let file of files) {\r\n if (!content) {\r\n content = file.content;\r\n } else {\r\n content = mergeWith(\r\n content,\r\n file.content,\r\n (objValue, srcValue) => {\r\n if (Array.isArray(objValue)) {\r\n return objValue.concat(srcValue);\r\n }\r\n return undefined;\r\n }\r\n );\r\n }\r\n }\r\n\r\n if (content) {\r\n const serialized = await serializeFile(path, content, options);\r\n if (serialized) {\r\n serializedFiles.push(serialized);\r\n }\r\n }\r\n }\r\n\r\n yield serializedFiles;\r\n}\r\n\r\n/**\r\n * Serializes the given output file content into a serialized file.\r\n * @param path The path that the file should be saved to.\r\n * @param content The content of the file.\r\n * @param options The options for serialization.\r\n */\r\nexport async function serializeFile(\r\n path: string,\r\n content: OutputFile['content'],\r\n options: SerializeApiOptions\r\n): Promise<SerializedFile | null> {\r\n const logger = log.getLogger();\r\n let fileContent: OutputFileContent;\r\n if (typeof content === 'function') {\r\n fileContent = await content();\r\n } else {\r\n fileContent = content;\r\n }\r\n\r\n const ext = extname(path);\r\n if (ext === '.json') {\r\n let json: string;\r\n if (fileContent instanceof ReadableStream) {\r\n json = '';\r\n for await (const chunk of Readable.fromWeb(fileContent as any, {\r\n encoding: 'utf-8',\r\n })) {\r\n json += chunk;\r\n }\r\n } else {\r\n json = JSON.stringify(\r\n content,\r\n undefined,\r\n options.pretty ? 2 : undefined\r\n );\r\n }\r\n\r\n return {\r\n path,\r\n content: json,\r\n sha256: () =>\r\n fromByteArray(new Uint8Array(sha256().update(json).digest())),\r\n };\r\n } else if (ext === '.mp3') {\r\n if (fileContent instanceof ReadableStream) {\r\n return {\r\n path,\r\n content: Readable.fromWeb(fileContent as any),\r\n };\r\n } else {\r\n logger.warn('Expected content to be a readable stream for', path);\r\n logger.warn('Skipping file');\r\n return null;\r\n }\r\n }\r\n\r\n logger.warn('Unknown file type', path);\r\n logger.warn('Skipping file');\r\n return null;\r\n}\r\n\r\n// /**\r\n// * Loads the files for the given translations.\r\n// * @param dir The directory that the translations exist in.\r\n// */\r\n// export async function loadTranslationsFiles(\r\n// dirs: string[]\r\n// ): Promise<InputFile[]> {\r\n// const promises = [] as Promise<InputFile[]>[];\r\n// for (let dir of dirs) {\r\n// const fullPath = path.resolve(dir);\r\n// promises.push(\r\n// loadTranslationFiles(fullPath).then((files) => files ?? [])\r\n// );\r\n// }\r\n\r\n// const allFiles = await Promise.all(promises);\r\n// const files = allFiles.flat();\r\n// return files;\r\n// }\r\n\r\n/**\r\n * Loads the files for the given translations.\r\n * @param dir The directory that the translations exist in.\r\n */\r\nexport async function loadTranslationsFiles(\r\n dirs: string[]\r\n): Promise<InputFile[]> {\r\n const promises = [] as Promise<InputFile[]>[];\r\n for (let dir of dirs) {\r\n const fullPath = path.resolve(dir);\r\n promises.push(\r\n loadTranslationFiles(fullPath).then((files) => files ?? [])\r\n );\r\n }\r\n\r\n const allFiles = await Promise.all(promises);\r\n const files = allFiles.flat();\r\n return files;\r\n}\r\n\r\n/**\r\n * Loads the files for the given translation.\r\n * @param translation The directory that the translation exists in.\r\n * @returns The list of files that were loaded, or null if the translation has no metadata.\r\n */\r\nexport async function loadTranslationFiles(\r\n translation: string,\r\n translationMetadata?: InputTranslationMetadata\r\n): Promise<InputFile[] | null> {\r\n const logger = log.getLogger();\r\n const metadata: InputTranslationMetadata | null =\r\n translationMetadata ?? (await loadTranslationMetadata(translation));\r\n\r\n if (!metadata) {\r\n logger.error('Could not load metadata for translation!', translation);\r\n return null;\r\n }\r\n\r\n let files = await readdir(translation);\r\n let usfmFiles = files.filter(\r\n (f) =>\r\n extname(f) === '.usfm' ||\r\n extname(f) === '.usx' ||\r\n extname(f) === '.json' ||\r\n extname(f) === '.codex' ||\r\n f.endsWith('.lockman.txt')\r\n );\r\n\r\n if (usfmFiles.length <= 0) {\r\n translation = path.resolve(translation, 'usfm');\r\n if (existsSync(translation)) {\r\n files = await readdir(translation);\r\n usfmFiles = files.filter((f) => extname(f) === '.usfm');\r\n }\r\n }\r\n\r\n if (usfmFiles.length <= 0) {\r\n logger.error('Could not find files for translation!', translation);\r\n return [];\r\n }\r\n\r\n let promises = [] as Promise<InputFile>[];\r\n for (let file of usfmFiles) {\r\n if (path.parse(file).name === 'metadata') {\r\n continue;\r\n }\r\n const filePath = path.resolve(translation, file);\r\n let fileType = getFileType(file);\r\n if (!fileType) {\r\n logger.warn(`Unknown file type for ${filePath}, skipping file.`);\r\n continue;\r\n }\r\n promises.push(loadFile(fileType, filePath, metadata));\r\n }\r\n\r\n return await Promise.all(promises);\r\n}\r\n\r\n/**\r\n * Loads the files for the given commentaries.\r\n * @param dir The directory that the commentaries exist in.\r\n */\r\nexport async function loadCommentariesFiles(\r\n dirs: string[]\r\n): Promise<InputFile[]> {\r\n const promises = [] as Promise<InputFile[]>[];\r\n for (let dir of dirs) {\r\n const fullPath = path.resolve(dir);\r\n promises.push(\r\n loadCommentaryFiles(fullPath).then((files) => files ?? [])\r\n );\r\n }\r\n\r\n const allFiles = await Promise.all(promises);\r\n const files = allFiles.flat();\r\n return files;\r\n}\r\n\r\n/**\r\n * Loads the files for the given commentary.\r\n * @param commentary The directory that the commentary exists in.\r\n * @returns The list of files that were loaded, or null if the commentary has no metadata.\r\n */\r\nexport async function loadCommentaryFiles(\r\n commentary: string\r\n): Promise<InputFile[] | null> {\r\n const logger = log.getLogger();\r\n const metadata: InputCommentaryMetadata | null =\r\n await loadCommentaryMetadata(commentary);\r\n\r\n if (!metadata) {\r\n logger.error('Could not load metadata for commentary!', commentary);\r\n return null;\r\n }\r\n\r\n let files = await readdir(commentary);\r\n let commentaryFiles = files.filter(\r\n (f) => extname(f) === '.csv' || f.endsWith('.tyndale.xml')\r\n );\r\n\r\n if (commentaryFiles.length <= 0) {\r\n logger.error('Could not find files for commentary!', commentary);\r\n return [];\r\n }\r\n\r\n let promises = [] as Promise<InputFile>[];\r\n for (let file of commentaryFiles) {\r\n if (path.parse(file).name === 'metadata') {\r\n continue;\r\n }\r\n const filePath = path.resolve(commentary, file);\r\n\r\n const type =\r\n extname(filePath) === '.csv'\r\n ? 'commentary/csv'\r\n : 'commentary/tyndale-xml';\r\n\r\n promises.push(loadFile(type, filePath, metadata));\r\n }\r\n\r\n return await Promise.all(promises);\r\n}\r\n\r\n/**\r\n * Imports all the datasets from the given directory into the database in the current working directory.\r\n * @param dir The directory that the datasets are located in.\r\n * @param options The options.\r\n */\r\nexport async function loadTranslationsFromDirectory(\r\n dir: string\r\n): Promise<DatasetTranslation[]> {\r\n const logger = log.getLogger();\r\n\r\n let translations: DatasetTranslation[] = [];\r\n\r\n const apiDir = path.resolve(dir, 'api');\r\n\r\n const availableTranslationsPath = path.resolve(\r\n apiDir,\r\n 'available_translations.json'\r\n );\r\n\r\n if (!existsSync(availableTranslationsPath)) {\r\n logger.warn(\r\n `Could not find available_translations.json at ${availableTranslationsPath}, skipping translation loading.`\r\n );\r\n return [];\r\n }\r\n\r\n const availableTranslations: ApiAvailableTranslations = JSON.parse(\r\n await readFile(availableTranslationsPath, 'utf-8')\r\n );\r\n translations.push(\r\n ...availableTranslations.translations.map((d: any) => ({\r\n ...d,\r\n books: [],\r\n }))\r\n );\r\n\r\n for (let dataset of translations) {\r\n const datasetDir = path.resolve(apiDir, dataset.id);\r\n const booksList = await readdir(datasetDir, { withFileTypes: true });\r\n\r\n const booksPath = path.resolve(datasetDir, 'books.json');\r\n const booksData: ApiTranslationBooks | null = existsSync(booksPath)\r\n ? JSON.parse(await readFile(booksPath, 'utf-8'))\r\n : null;\r\n\r\n for (let entry of booksList) {\r\n // The translation directory also contains the files that aren't scoped to a\r\n // book, like books.json and the complete translation downloads.\r\n if (!entry.isDirectory()) {\r\n continue;\r\n }\r\n\r\n const bookId = entry.name;\r\n const id = getBookId(bookId);\r\n\r\n if (!id) {\r\n logger.warn(`Unknown book directory: ${bookId}`);\r\n continue;\r\n }\r\n\r\n const bookData = booksData?.books.find((b) => b.id === id);\r\n if (!bookData) {\r\n logger.warn(\r\n `Could not find book data for book ${id} in translation ${dataset.id}`\r\n );\r\n }\r\n\r\n const book: DatasetTranslationBook = {\r\n id,\r\n commonName: bookData?.commonName ?? '',\r\n name: bookData?.name ?? '',\r\n title: bookData?.title ?? '',\r\n chapters: [],\r\n order: bookOrderMap.get(id)!,\r\n };\r\n dataset.books.push(book);\r\n\r\n const bookDir = path.resolve(datasetDir, bookId);\r\n const chapters = await readdir(bookDir);\r\n\r\n for (let chapterFile of chapters) {\r\n // Book directories also contain the sidecar files for a chapter\r\n // (audio timings and words) and the other chapter formats\r\n // (the simplified chapters). They are loaded through the chapter\r\n // that links to them, not on their own.\r\n if (!isChapterFile(chapterFile)) {\r\n continue;\r\n }\r\n\r\n const chapterJson: ApiTranslationBookChapter = JSON.parse(\r\n await readFile(path.resolve(bookDir, chapterFile), 'utf-8')\r\n );\r\n\r\n if (chapterJson.chapter) {\r\n const words = chapterJson.thisChapterWordsLink\r\n ? await readChapterWords(\r\n bookDir,\r\n chapterJson.chapter.number\r\n )\r\n : null;\r\n\r\n book.chapters.push({\r\n chapter: chapterJson.chapter,\r\n thisChapterAudioLinks:\r\n chapterJson.thisChapterAudioLinks,\r\n // Audio timings can't be reconstructed from the generated JSON files:\r\n // thisChapterAudioTimings there is a map of reader -> URL, not the\r\n // raw per-verse timing data. Re-importing timings requires the\r\n // `import-audio-timings` CLI command instead.\r\n thisChapterAudioTimings: {},\r\n ...(words ? { thisChapterWords: words } : {}),\r\n });\r\n } else {\r\n logger.warn(`Unknown chapter format: ${chapterFile}`);\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return translations;\r\n}\r\n\r\n/**\r\n * Determines whether the given file name in a book directory is a chapter file,\r\n * as opposed to one of the sidecar files that a chapter links to.\r\n * @param fileName The name of the file.\r\n */\r\nfunction isChapterFile(fileName: string): boolean {\r\n return /^[0-9]+\\.json$/.test(fileName);\r\n}\r\n\r\n/**\r\n * Reads the word-level annotations for the given chapter from the book directory.\r\n * Returns null if they could not be read.\r\n * @param bookDir The directory that the book's files are in.\r\n * @param chapterNumber The number of the chapter.\r\n */\r\nasync function readChapterWords(\r\n bookDir: string,\r\n chapterNumber: number\r\n): Promise<TranslationBookChapterWords | null> {\r\n const wordsPath = path.resolve(bookDir, `${chapterNumber}.words.json`);\r\n\r\n if (!existsSync(wordsPath)) {\r\n log.getLogger().warn(\r\n `Chapter links to word annotations, but ${wordsPath} does not exist.`\r\n );\r\n return null;\r\n }\r\n\r\n const words: ApiTranslationBookChapterWords = JSON.parse(\r\n await readFile(wordsPath, 'utf-8')\r\n );\r\n\r\n return words.verses ?? null;\r\n}\r\n\r\nasync function tryParseJsonFile<T>(\r\n filePath: string,\r\n schema: ZodType<T>\r\n): Promise<T | null> {\r\n if (!existsSync(filePath)) {\r\n return null;\r\n }\r\n\r\n try {\r\n const data = JSON.parse(await readFile(filePath, 'utf-8'));\r\n return schema.parse(data);\r\n } catch (err) {\r\n log.getLogger().error(\r\n `Failed to parse JSON file at ${filePath}: ${(err as Error).message}`\r\n );\r\n throw err;\r\n }\r\n}\r\n\r\n/**\r\n * Imports all the commentaries from the given directory into the database in the current working directory.\r\n * @param dir The directory that the commentaries are located in.\r\n */\r\nexport async function loadCommentariesFromDirectory(\r\n dir: string\r\n): Promise<DatasetCommentary[]> {\r\n const logger = log.getLogger();\r\n\r\n let commentaries: DatasetCommentary[] = [];\r\n\r\n const apiDir = path.resolve(dir, 'api');\r\n\r\n const availableCommentariesPath = path.resolve(\r\n apiDir,\r\n 'available_commentaries.json'\r\n );\r\n\r\n if (!existsSync(availableCommentariesPath)) {\r\n logger.warn(\r\n `Could not find available_commentaries.json at ${availableCommentariesPath}, skipping commentary loading.`\r\n );\r\n return [];\r\n }\r\n\r\n const availableCommentaries: ApiAvailableCommentaries =\r\n (await tryParseJsonFile(\r\n availableCommentariesPath,\r\n ApiAvailableCommentariesSchema\r\n ))!;\r\n commentaries.push(\r\n ...availableCommentaries.commentaries.map((c: any) => ({\r\n ...c,\r\n books: [],\r\n profiles: [],\r\n }))\r\n );\r\n\r\n for (let commentary of commentaries) {\r\n const commentaryDir = path.resolve(apiDir, 'c', commentary.id);\r\n const entries = await readdir(commentaryDir);\r\n\r\n const booksPath = path.resolve(commentaryDir, 'books.json');\r\n const booksData: ApiCommentaryBooks | null = await tryParseJsonFile(\r\n booksPath,\r\n ApiCommentaryBooksSchema\r\n );\r\n\r\n const profilesPath = path.resolve(commentaryDir, 'profiles.json');\r\n const profilesData: ApiCommentaryProfiles | null =\r\n await tryParseJsonFile(profilesPath, ApiCommentaryProfilesSchema);\r\n\r\n if (profilesData) {\r\n for (let profile of profilesData.profiles) {\r\n const profileContentPath = path.resolve(\r\n commentaryDir,\r\n 'profiles',\r\n `${replaceSpacesWithUnderscores(profile.id)}.json`\r\n );\r\n\r\n if (!existsSync(profileContentPath)) {\r\n logger.warn(\r\n `Could not find profile content for profile ${profile.id} in commentary ${commentary.id}`\r\n );\r\n continue;\r\n }\r\n\r\n const profileContent: ApiCommentaryProfileContent =\r\n ApiCommentaryProfileContentSchema.parse(\r\n JSON.parse(await readFile(profileContentPath, 'utf-8'))\r\n );\r\n\r\n commentary.profiles.push({\r\n id: profile.id,\r\n subject: profile.subject,\r\n reference: profile.reference,\r\n content: profileContent.content,\r\n });\r\n }\r\n }\r\n\r\n for (let entry of entries) {\r\n if (\r\n entry === 'books.json' ||\r\n entry === 'profiles.json' ||\r\n entry === 'profiles'\r\n ) {\r\n continue;\r\n }\r\n const id = getBookId(entry);\r\n\r\n if (!id) {\r\n logger.warn(`Unknown book directory: ${entry}`);\r\n continue;\r\n }\r\n\r\n const bookData = booksData?.books.find((b) => b.id === id);\r\n if (!bookData) {\r\n logger.warn(\r\n `Could not find book data for book ${id} in commentary ${commentary.id}`\r\n );\r\n }\r\n\r\n const book: DatasetCommentaryBook = {\r\n id,\r\n name: bookData?.name ?? '',\r\n commonName: bookData?.commonName ?? '',\r\n introduction: bookData?.introduction,\r\n introductionSummary: bookData?.introductionSummary,\r\n chapters: [],\r\n order: bookOrderMap.get(id)!,\r\n };\r\n commentary.books.push(book);\r\n\r\n const bookDir = path.resolve(commentaryDir, entry);\r\n const chapters = await readdir(bookDir);\r\n\r\n for (let chapterFile of chapters) {\r\n // Book directories also contain the other chapter formats\r\n // (the simplified chapters), which can't be imported as chapters.\r\n if (!isChapterFile(chapterFile)) {\r\n continue;\r\n }\r\n\r\n const chapterJson: CommentaryBookChapter | null =\r\n await tryParseJsonFile(\r\n path.resolve(bookDir, chapterFile),\r\n CommentaryBookChapterSchema\r\n );\r\n\r\n if (!chapterJson) {\r\n logger.warn(`Failed to parse chapter file: ${chapterFile}`);\r\n continue;\r\n }\r\n\r\n if (chapterJson.chapter) {\r\n book.chapters.push({\r\n chapter: chapterJson.chapter,\r\n });\r\n } else {\r\n logger.warn(`Unknown chapter format: ${chapterFile}`);\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return commentaries;\r\n}\r\n\r\n/**\r\n * Imports all the datasets from the given directory into the database in the current working directory.\r\n * @param dir The directory that the datasets are located in.\r\n * @param options The options.\r\n */\r\nexport async function loadDatasetsFromDirectory(\r\n dir: string\r\n): Promise<DatasetDataset[]> {\r\n const logger = log.getLogger();\r\n\r\n let datasets: DatasetDataset[] = [];\r\n\r\n const apiDir = path.resolve(dir, 'api');\r\n\r\n const availableDatasetsPath = path.resolve(\r\n apiDir,\r\n 'available_datasets.json'\r\n );\r\n\r\n if (!existsSync(availableDatasetsPath)) {\r\n logger.warn(\r\n `Could not find available_datasets.json at ${availableDatasetsPath}, skipping dataset loading.`\r\n );\r\n return [];\r\n }\r\n\r\n const availableDatasets = JSON.parse(\r\n await readFile(availableDatasetsPath, 'utf-8')\r\n );\r\n datasets.push(\r\n ...availableDatasets.datasets.map((d: any) => ({\r\n ...d,\r\n books: [],\r\n }))\r\n );\r\n\r\n for (let dataset of datasets) {\r\n const datasetDir = path.resolve(apiDir, 'd', dataset.id);\r\n const booksList = await readdir(datasetDir);\r\n\r\n for (let bookId of booksList) {\r\n if (bookId === 'books.json') {\r\n continue;\r\n }\r\n const id = getBookId(bookId);\r\n\r\n if (!id) {\r\n logger.warn(`Unknown book directory: ${bookId}`);\r\n continue;\r\n }\r\n\r\n const book: DatasetDatasetBook = {\r\n id,\r\n chapters: [],\r\n order: bookOrderMap.get(id)!,\r\n };\r\n dataset.books.push(book);\r\n\r\n const bookDir = path.resolve(datasetDir, bookId);\r\n const chapters = await readdir(bookDir);\r\n\r\n for (let chapterFile of chapters) {\r\n const chapterJson = JSON.parse(\r\n await readFile(path.resolve(bookDir, chapterFile), 'utf-8')\r\n );\r\n\r\n if (chapterJson.chapter) {\r\n book.chapters.push({\r\n chapter: chapterJson.chapter,\r\n });\r\n } else if (chapterJson.content) {\r\n const chapterNumber = parseInt(\r\n basename(chapterFile, extname(chapterFile))\r\n );\r\n\r\n if (isNaN(chapterNumber)) {\r\n logger.warn(`Unknown chapter format: ${chapterFile}`);\r\n continue;\r\n }\r\n\r\n book.chapters.push({\r\n chapter: {\r\n number: chapterNumber,\r\n content: chapterJson.content.map((c: any) => ({\r\n verse: c.verse,\r\n references: (c.references ?? []).map(\r\n (ref: any) => ({\r\n book: ref.book,\r\n chapter: ref.chapter,\r\n verse: ref.verse,\r\n endVerse: ref.endVerse,\r\n score: ref.score ?? ref.votes,\r\n })\r\n ),\r\n })),\r\n },\r\n });\r\n } else {\r\n logger.warn(`Unknown chapter format: ${chapterFile}`);\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return datasets;\r\n}\r\n\r\n/**\r\n * Loads the metadata for the given translation.\r\n * @param translation The translation that the metadata should be loaded for.\r\n * @returns\r\n */\r\nasync function loadTranslationMetadata(\r\n translation: string\r\n): Promise<InputTranslationMetadata | null> {\r\n const logger = log.getLogger();\r\n const metadataTs = path.resolve(translation, 'metadata.ts');\r\n if (existsSync(metadataTs)) {\r\n const importPath = new URL('file://' + metadataTs).href;\r\n return (await import(importPath)).default as InputTranslationMetadata;\r\n } else {\r\n const metadataJson = path.resolve(translation, 'meta.json');\r\n if (existsSync(metadataJson)) {\r\n const data = await readFile(metadataJson, { encoding: 'utf-8' });\r\n const metadata = JSON.parse(data) as CollectionTranslationMetadata;\r\n\r\n return {\r\n id: metadata.id ?? metadata.source.id,\r\n language: metadata.language,\r\n name: metadata.name.local,\r\n englishName: metadata.name.english,\r\n licenseUrl: metadata.copyright.attribution_url,\r\n website: metadata.copyright.attribution_url,\r\n shortName: metadata.name.abbrev,\r\n direction: metadata.direction,\r\n };\r\n } else {\r\n const metadataJson = path.resolve(translation, 'metadata.json');\r\n if (existsSync(metadataJson)) {\r\n const data = await readFile(metadataJson, {\r\n encoding: 'utf-8',\r\n });\r\n return JSON.parse(data) as InputTranslationMetadata;\r\n }\r\n }\r\n }\r\n logger.error('Could not find metadata for translation!', translation);\r\n return null;\r\n}\r\n\r\n/**\r\n * Loads the metadata for the given commentary.\r\n * @param commentary The path to the directory that the commentary is stored in.\r\n * @returns\r\n */\r\nasync function loadCommentaryMetadata(\r\n commentary: string\r\n): Promise<InputCommentaryMetadata | null> {\r\n const logger = log.getLogger();\r\n const metadataTs = path.resolve(commentary, 'metadata.ts');\r\n if (existsSync(metadataTs)) {\r\n return (await import(metadataTs)).default as InputCommentaryMetadata;\r\n } else {\r\n const metadataJson = path.resolve(commentary, 'metadata.json');\r\n if (existsSync(metadataJson)) {\r\n const data = await readFile(metadataJson, {\r\n encoding: 'utf-8',\r\n });\r\n return JSON.parse(data) as InputCommentaryMetadata;\r\n }\r\n }\r\n logger.error('Could not find metadata for commentary!', commentary);\r\n return null;\r\n}\r\n\r\nfunction getFileType(path: string): InputTranslationFile['fileType'] | null {\r\n if (path.endsWith('.lockman.txt')) {\r\n return 'lockman';\r\n } else if (extname(path) === '.usfm') {\r\n return 'usfm';\r\n } else if (extname(path) === '.usx') {\r\n return 'usx';\r\n } else if (extname(path) === '.json') {\r\n return 'json';\r\n } else if (extname(path) === '.codex') {\r\n return 'json';\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Loads the file from the given path using the given metadata.\r\n * @param fileType The type of the file.\r\n * @param file The file that should be loaded.\r\n * @param metadata The metadata.\r\n */\r\nasync function loadFile(\r\n fileType: InputFile['fileType'],\r\n file: string,\r\n metadata: InputFileMetadata\r\n): Promise<InputFile> {\r\n const content = await readFile(file, {\r\n encoding: 'utf-8',\r\n });\r\n\r\n const hash = sha256()\r\n .update(content)\r\n\r\n // Hack to ensure that file hashes are different for different versions of the parser.\r\n .update(\r\n (fileType === 'lockman' ? LOCKMAN_PARSER_VERSION : PARSER_VERSION) +\r\n DATASET_VERSION\r\n )\r\n .digest('hex');\r\n\r\n return {\r\n content,\r\n metadata: metadata,\r\n name: file,\r\n sha256: hash,\r\n fileType: fileType as any,\r\n };\r\n}\r\n\r\nexport interface CollectionTranslationMetadata {\r\n name: {\r\n local: string;\r\n abbrev: string;\r\n english: string;\r\n };\r\n language: string;\r\n year: number;\r\n direction: 'ltr' | 'rtl';\r\n copyright: {\r\n licenses: any[];\r\n attribution: string;\r\n attribution_url: string;\r\n };\r\n id: string | null;\r\n source: {\r\n id: string;\r\n };\r\n}\r\n\r\n/**\r\n * Defines an uploader that is able to upload files to a directory.\r\n */\r\nexport class FilesUploader implements Uploader {\r\n private _dir: string;\r\n\r\n constructor(dir: string) {\r\n this._dir = dir;\r\n }\r\n\r\n get idealBatchSize(): number | null {\r\n return null;\r\n }\r\n\r\n async upload(file: SerializedFile, overwrite: boolean): Promise<boolean> {\r\n const filePath = path.resolve(this._dir, makeRelativePath(file.path));\r\n await mkdir(path.dirname(filePath), { recursive: true });\r\n\r\n if (overwrite || !existsSync(filePath)) {\r\n await writeFile(filePath, file.content, 'utf-8');\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Defines an uploader that is able to upload files into a zip file.\r\n */\r\nexport class ZipUploader implements Uploader {\r\n private _path: string;\r\n private _initPromise: Promise<ZipWriter<unknown>>;\r\n private _fileHandle: FileHandle | null = null;\r\n private _zip: ZipWriter<unknown> | null = null;\r\n\r\n constructor(filePath: string) {\r\n this._path = filePath;\r\n this._initPromise = this._init();\r\n }\r\n\r\n private async _init(): Promise<ZipWriter<unknown>> {\r\n this._fileHandle = await open(path.resolve(this._path), 'w');\r\n const writableStream = this._fileHandle.createWriteStream();\r\n this._zip = new ZipWriter(Writable.toWeb(writableStream));\r\n return this._zip;\r\n }\r\n\r\n get idealBatchSize(): number | null {\r\n return 50;\r\n }\r\n\r\n async upload(file: SerializedFile, _overwrite: boolean): Promise<boolean> {\r\n const zip = await this._initPromise;\r\n\r\n let reader: Reader<any> | ReadableStream;\r\n if (file.content instanceof Readable) {\r\n reader = Readable.toWeb(file.content) as any;\r\n } else if (typeof file.content === 'string') {\r\n reader = new TextReader(file.content);\r\n } else {\r\n throw new Error('Unknown file content type');\r\n }\r\n\r\n await zip.add(trimRelativePath(file.path), reader);\r\n return true;\r\n }\r\n\r\n async dispose(): Promise<void> {\r\n if (this._zip) {\r\n await this._zip.close();\r\n }\r\n if (this._fileHandle) {\r\n await this._fileHandle.close();\r\n }\r\n }\r\n}\r\n\r\nfunction trimRelativePath(path: string): string {\r\n if (path.startsWith('./')) {\r\n return path.substring(2);\r\n } else if (path.startsWith('../')) {\r\n return path.substring(3);\r\n } else if (path.startsWith('/')) {\r\n return path.substring(1);\r\n }\r\n\r\n return path;\r\n}\r\n\r\nfunction makeRelativePath(path: string): string {\r\n if (path.startsWith('/')) {\r\n return '.' + path;\r\n }\r\n return path;\r\n}\r\n\r\n/**\r\n * Calculates the SHa256 hash of the given input files.\r\n * @param files The files to hash.\r\n */\r\nexport function hashInputFiles(files: InputFile[]): string {\r\n let sha = sha256();\r\n for (let file of files) {\r\n if (file.sha256) {\r\n sha.update(file.sha256);\r\n } else {\r\n sha.update(file.content);\r\n }\r\n }\r\n return sha.digest('hex');\r\n}\r\n", "import {\n S3Client,\n PutObjectCommand,\n HeadObjectCommand,\n NotFound,\n} from '@aws-sdk/client-s3';\nimport { fromNodeProviderChain } from '@aws-sdk/credential-providers'; // ES6 import\nimport { SerializedFile, Uploader } from './files.js';\nimport { AwsCredentialIdentity, Provider } from '@smithy/types';\nimport { input, password } from '@inquirer/prompts';\nimport { log } from '@helloao/tools';\n\nexport class S3Uploader implements Uploader {\n private _client: S3Client;\n\n private _bucketName: string;\n private _keyPrefix: string;\n\n get idealBatchSize() {\n return 75;\n }\n\n get retryCount() {\n return 10;\n }\n\n constructor(\n bucketName: string,\n keyPrefix: string,\n profile:\n | string\n | null\n | AwsCredentialIdentity\n | Provider<AwsCredentialIdentity>,\n region?: string\n ) {\n this._bucketName = bucketName;\n this._keyPrefix = keyPrefix;\n this._client = new S3Client({\n region: region,\n credentials:\n !profile || typeof profile === 'string'\n ? fromNodeProviderChain({ profile: profile ?? undefined })\n : profile,\n maxAttempts: 10,\n retryMode: 'standard',\n });\n\n if ((!process.env.AWS_REGION || !process.env.AWS_PROFILE) && !region) {\n const logger = log.getLogger();\n logger.warn(\n 'No AWS_REGION or AWS_PROFILE environment variable set. This may cause issues with the S3 client.'\n );\n }\n }\n\n async upload(file: SerializedFile, overwrite: boolean): Promise<boolean> {\n const logger = log.getLogger();\n let lastErr: unknown;\n for (let attempt = 0; attempt <= this.retryCount; attempt++) {\n if (attempt > 0) {\n const delayMs = Math.pow(2, attempt - 1) * 1000;\n logger.warn(\n `[s3] Retrying upload (attempt ${attempt}/${this.retryCount}) for ${file.path} after ${delayMs}ms`\n );\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n }\n try {\n return await this._upload(file, overwrite);\n } catch (err) {\n lastErr = err;\n logger.error(\n `[s3] Upload attempt ${attempt + 1} failed for file: ${file.path}`,\n err\n );\n }\n }\n throw lastErr;\n }\n\n private async _upload(\n file: SerializedFile,\n overwrite: boolean\n ): Promise<boolean> {\n const logger = log.getLogger();\n const path = file.path.startsWith('/')\n ? file.path.substring(1)\n : file.path;\n const key = this._keyPrefix ? `${this._keyPrefix}/${path}` : path;\n\n const hash = file.sha256?.();\n const head = new HeadObjectCommand({\n Bucket: this._bucketName,\n Key: key,\n ChecksumMode: 'ENABLED',\n });\n\n if (hash || !overwrite) {\n try {\n const existingFile = await this._client.send(head);\n let matches = true;\n if (hash && existingFile.ChecksumSHA256) {\n if (\n hash.localeCompare(\n existingFile?.ChecksumSHA256 ?? '',\n undefined,\n {\n sensitivity: 'base',\n }\n ) === 0\n ) {\n // File is already uploaded and matches the checksum.\n return false;\n } else {\n // File is already uploaded but the checksums don't match.\n matches = false;\n }\n } else {\n // File is already uploaded but the checksum is not available.\n logger.log(`[s3] Checksum not available: ${key}`);\n\n // Assume the file has changed and needs to be uploaded again.\n matches = false;\n }\n\n if (matches && !overwrite) {\n return false;\n }\n } catch (err: any) {\n if (err instanceof NotFound) {\n // not found, so we can try to write the file.\n } else {\n throw err;\n }\n }\n }\n\n const command = new PutObjectCommand({\n Bucket: this._bucketName,\n Key: key,\n Body: file.content,\n ContentType: 'application/json',\n ChecksumSHA256: hash,\n ChecksumAlgorithm: 'SHA256',\n });\n\n await this._client.send(command);\n return true;\n }\n}\n\n/**\n * Parses the given S3 URL into its bucket name and object key.\n * @param url The URL to parse.\n */\nexport function parseS3Url(url: string) {\n const regex = /^s3:\\/\\/([a-z0-9.\\-]+)(\\/[^${}]*)?$/;\n const matched = url.match(regex);\n if (matched) {\n const arr = [...matched];\n let key = arr[2] ?? '';\n if (key.startsWith('/')) {\n key = key.substring(1);\n }\n return {\n bucketName: arr[1],\n objectKey: key,\n };\n }\n return undefined;\n}\n\n/**\n * Gets the HTTP URL for the given S3 URL.\n * @param s3Url The S3 URL to convert.\n */\nexport function getHttpUrl(s3Url: string) {\n const parsed = parseS3Url(s3Url);\n if (!parsed) {\n return undefined;\n }\n const { bucketName, objectKey } = parsed;\n if (objectKey) {\n return `https://${bucketName}.s3.amazonaws.com/${objectKey}`;\n } else {\n return `https://${bucketName}.s3.amazonaws.com`;\n }\n}\n\n/**\n * A provider that gets the credentials directly from the user input.\n */\nexport const askForAccessKeyProvider: Provider<\n AwsCredentialIdentity\n> = async () => {\n const accessKeyId = await input({\n message: 'Enter your AWS Access Key ID',\n });\n const secretAccessKey = await password({\n message: 'Enter your AWS Secret Access Key',\n });\n\n return {\n accessKeyId,\n secretAccessKey,\n };\n};\n\n/**\n * Defines a provider that tries to get the credentials from the given list of providers.\n * @param providers The providers to try.\n */\nexport function providerChain(\n ...providers: Provider<AwsCredentialIdentity>[]\n): Provider<AwsCredentialIdentity> {\n return async () => {\n for (const provider of providers) {\n const creds = await provider();\n if (creds?.accessKeyId && creds?.secretAccessKey) {\n return creds;\n }\n }\n\n return {\n accessKeyId: '',\n secretAccessKey: '',\n };\n };\n}\n\n/**\n * Gets the default provider for the given options.\n *\n * Defaults first to using the provided access key and secret access key, then to using the given profile, then finally to asking the user for the access key.\n * @param options\n */\nexport function defaultProviderForOptions(options: {\n accessKeyId?: string;\n secretAccessKey?: string;\n profile?: string;\n}): Provider<AwsCredentialIdentity> | AwsCredentialIdentity {\n if (options.accessKeyId && options.secretAccessKey) {\n return {\n accessKeyId: options.accessKeyId,\n secretAccessKey: options.secretAccessKey,\n };\n }\n\n return providerChain(\n fromNodeProviderChain({ profile: options.profile }),\n askForAccessKeyProvider\n );\n}\n", "import { loadDatasets, serializeDatasets, SerializedFile } from './db.js';\r\nimport { defaultProviderForOptions, parseS3Url, S3Uploader } from './s3.js';\r\nimport { extname } from 'path';\r\nimport {\r\n FilesUploader,\r\n serializeFile,\r\n Uploader,\r\n ZipUploader,\r\n} from './files.js';\r\nimport { Readable } from 'node:stream';\r\nimport { DatasetOutput } from '@helloao/tools/generation/dataset.js';\r\nimport { PrismaClient } from './prisma-gen/client.js';\r\nimport { GenerateApiOptions } from '@helloao/tools/generation/api.js';\r\nimport { log } from '@helloao/tools';\r\nimport { createFreeUseBibleApiOpenApiDocument } from './openapi.js';\r\n\r\nexport interface UploadApiFromDatabaseOptions\r\n extends UploadApiOptions,\r\n GenerateApiOptions {\r\n /**\r\n * The number of files to upload in each batch.\r\n */\r\n batchSize: string | number;\r\n}\r\n\r\nexport interface UploadApiOptions {\r\n /**\r\n * Whether to overwrite existing files.\r\n */\r\n overwrite?: boolean;\r\n\r\n /**\r\n * Whether to only overwrite common files.\r\n * \"Common files\" are files that are similar between translations, like the books.json endpoint, or individual chapter endpoints.\r\n */\r\n overwriteCommonFiles?: boolean;\r\n\r\n /**\r\n * Whether to only overwrite merged files.\r\n * \"Merged files\" are files that are generated from multiple translations, like the available_translations.json endpoint.\r\n */\r\n overwriteMergedFiles?: boolean;\r\n\r\n /**\r\n * The file pattern regex that should be used to filter the files that are uploaded.\r\n */\r\n filePattern?: string;\r\n\r\n /**\r\n * The translations to generate API files for.\r\n */\r\n translations?: string[];\r\n\r\n /**\r\n * The AWS profile to use for uploading to S3.\r\n */\r\n profile?: string;\r\n\r\n /**\r\n * The AWS access key ID to use for uploading to S3.\r\n */\r\n accessKeyId?: string;\r\n\r\n /**\r\n * The AWS secret access key to use for uploading to S3.\r\n */\r\n secretAccessKey?: string;\r\n\r\n /**\r\n * The AWS region to use for uploading to S3.\r\n */\r\n s3Region?: string;\r\n\r\n /**\r\n * Whether to generate API files that use the common name instead of book IDs.\r\n */\r\n useCommonName?: boolean;\r\n\r\n /**\r\n * Whether to generate audio files for the API.\r\n */\r\n generateAudioFiles?: boolean;\r\n\r\n /**\r\n * Whether to generate the OpenAPI document for the API.\r\n * Defaults to true.\r\n */\r\n generateOpenApiDocument?: boolean;\r\n\r\n /**\r\n * Whether to generate pretty-printed JSON files.\r\n */\r\n pretty?: boolean;\r\n\r\n /**\r\n * Whether to output verbose log information.\r\n */\r\n verbose?: boolean;\r\n}\r\n\r\n/**\r\n * Loads and generates the API files from the database and uploads them to the specified destination.\r\n * @param db The database that the datasets should be loaded from.\r\n * @param dest The destination to upload the API files to. Supported destinations are S3, zip files, and local directories.\r\n * @param options The options to use for the upload.\r\n */\r\nexport async function uploadApiFilesFromDatabase(\r\n db: PrismaClient,\r\n dest: string,\r\n options: UploadApiFromDatabaseOptions\r\n) {\r\n const logger = log.getLogger();\r\n if (options.overwrite) {\r\n logger.log('Overwriting existing files');\r\n }\r\n\r\n if (options.overwriteCommonFiles) {\r\n logger.log('Overwriting only common files');\r\n }\r\n\r\n if (!!options.filePattern) {\r\n logger.log('Using file pattern:', options.filePattern);\r\n }\r\n\r\n if (options.translations) {\r\n logger.log(\r\n 'Generating for specific translations:',\r\n options.translations\r\n );\r\n } else {\r\n logger.log('Generating for all translations');\r\n }\r\n\r\n if (options.generateOpenApiDocument !== false) {\r\n logger.log('Generating OpenAPI document');\r\n }\r\n\r\n if (options.pretty) {\r\n logger.log('Generating pretty-printed JSON files');\r\n }\r\n\r\n if (options.generateCompleteTranslationFiles) {\r\n logger.log('Generating complete translation files');\r\n }\r\n\r\n if (options.generateSimpleChapterFiles) {\r\n logger.log('Generating simplified chapter files');\r\n }\r\n\r\n const pageSize =\r\n typeof options.batchSize === 'number'\r\n ? options.batchSize\r\n : parseInt(options.batchSize);\r\n await serializeAndUploadDatasets(\r\n dest,\r\n loadDatasets(db, pageSize, options.translations),\r\n options\r\n );\r\n\r\n if (options.generateOpenApiDocument !== false) {\r\n await uploadOpenApiDocument(dest, options);\r\n }\r\n}\r\n\r\nexport async function uploadOpenApiDocument(\r\n dest: string,\r\n options: UploadApiFromDatabaseOptions\r\n) {\r\n async function* iterator(): AsyncGenerator<SerializedFile[]> {\r\n const file = await serializeFile(\r\n '/openapi.json',\r\n createFreeUseBibleApiOpenApiDocument(),\r\n {\r\n pretty: true,\r\n }\r\n );\r\n if (file) {\r\n yield [file];\r\n } else {\r\n yield [];\r\n }\r\n }\r\n\r\n await uploadFiles(dest, options, iterator());\r\n}\r\n\r\n/**\r\n * Generates the API files from the given datasets and uploads them to the specified destination.\r\n * @param dest The destination to upload the API files to. Supported destinations are S3, zip files, and local directories.\r\n * @param options The options to use for the upload.\r\n * @param datasets The datasets to generate the API files from.\r\n */\r\nexport async function serializeAndUploadDatasets(\r\n dest: string,\r\n datasets: AsyncIterable<DatasetOutput>,\r\n options: UploadApiOptions & GenerateApiOptions = {}\r\n): Promise<void> {\r\n const logger = log.getLogger();\r\n const overwrite = !!options.overwrite;\r\n if (overwrite) {\r\n logger.log('Overwriting existing files');\r\n }\r\n\r\n const overwriteCommonFiles = !!options.overwriteCommonFiles;\r\n if (overwriteCommonFiles) {\r\n logger.log('Overwriting only common files');\r\n }\r\n\r\n const overwriteMergedFiles = !!options.overwriteMergedFiles;\r\n if (overwriteMergedFiles) {\r\n logger.log('Overwriting only merged files');\r\n }\r\n\r\n let filePattern: RegExp | undefined;\r\n if (!!options.filePattern) {\r\n filePattern = new RegExp(options.filePattern, 'g');\r\n logger.log('Using file pattern:', filePattern);\r\n }\r\n\r\n if (options.translations) {\r\n logger.log(\r\n 'Generating for specific translations:',\r\n options.translations\r\n );\r\n } else {\r\n logger.log('Generating for all translations');\r\n }\r\n\r\n if (options.pretty) {\r\n logger.log('Generating pretty-printed JSON files');\r\n }\r\n\r\n if (options.generateCompleteTranslationFiles) {\r\n logger.log('Generating complete translation files');\r\n }\r\n\r\n if (options.generateSimpleChapterFiles) {\r\n logger.log('Generating simplified chapter files');\r\n }\r\n\r\n const files = serializeDatasets(datasets, {\r\n ...options,\r\n });\r\n\r\n await uploadFiles(dest, options, files);\r\n}\r\n\r\n/**\r\n * Uploads the given serialized files to the specified destination.\r\n * @param dest The destination to upload the API files to. Supported destinations are S3, zip files, and local directories.\r\n * @param options The options to use for the upload.\r\n * @param datasets The datasets to generate the API files from.\r\n */\r\nexport async function uploadFiles(\r\n dest: string,\r\n options: UploadApiOptions,\r\n serializedFiles: AsyncIterable<SerializedFile[]>\r\n): Promise<void> {\r\n const logger = log.getLogger();\r\n let uploader: Uploader;\r\n if (dest.startsWith('s3://')) {\r\n logger.log('Uploading to S3');\r\n // Upload to S3\r\n const url = dest;\r\n const s3Url = parseS3Url(url);\r\n if (!s3Url) {\r\n throw new Error(`Invalid S3 URL: ${url}`);\r\n }\r\n\r\n if (!s3Url.bucketName) {\r\n throw new Error(\r\n `Invalid S3 URL: ${url}\\nUnable to determine bucket name`\r\n );\r\n }\r\n\r\n uploader = new S3Uploader(\r\n s3Url.bucketName,\r\n s3Url.objectKey,\r\n defaultProviderForOptions(options),\r\n options.s3Region\r\n );\r\n } else if (dest.startsWith('console://')) {\r\n logger.log('Uploading to console');\r\n uploader = {\r\n idealBatchSize: 50,\r\n async upload(\r\n file: SerializedFile,\r\n _overwrite: boolean\r\n ): Promise<boolean> {\r\n logger.log(file.path);\r\n logger.log(file.content);\r\n return true;\r\n },\r\n };\r\n } else if (extname(dest) === '.zip') {\r\n logger.log('Writing to zip file:', dest);\r\n uploader = new ZipUploader(dest);\r\n } else if (dest) {\r\n logger.log('Writing to local directory:', dest);\r\n uploader = new FilesUploader(dest);\r\n } else {\r\n logger.error('Unsupported destination:', dest);\r\n process.exit(1);\r\n }\r\n\r\n try {\r\n await uploadFilesUsingUploader(uploader, options, serializedFiles);\r\n } catch (err) {\r\n logger.error('Error uploading files:', err);\r\n throw err;\r\n } finally {\r\n if (uploader && uploader.dispose) {\r\n await uploader.dispose();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Uploads the given serialized files using the given uploader.\r\n * @param uploader The uploader to use.\r\n * @param options The options to use for the upload.\r\n * @param datasets The datasets to generate the API files from.\r\n */\r\nexport async function uploadFilesUsingUploader(\r\n uploader: Uploader,\r\n options: UploadApiOptions,\r\n serializedFiles: AsyncIterable<SerializedFile[]>\r\n): Promise<void> {\r\n const logger = log.getLogger();\r\n const overwrite = !!options.overwrite;\r\n const overwriteCommonFiles = !!options.overwriteCommonFiles;\r\n const overwriteMergedFiles = !!options.overwriteMergedFiles;\r\n\r\n let filePattern: RegExp | undefined;\r\n if (!!options.filePattern) {\r\n filePattern = new RegExp(options.filePattern, 'g');\r\n }\r\n\r\n for await (let files of serializedFiles) {\r\n const batchSize = uploader.idealBatchSize ?? files.length;\r\n const totalBatches = Math.ceil(files.length / batchSize);\r\n logger.log('Uploading', files.length, 'total files');\r\n logger.log('Uploading in batches of', batchSize);\r\n\r\n let offset = 0;\r\n let batchNumber = 1;\r\n let batch = files.slice(offset, offset + batchSize);\r\n\r\n while (batch.length > 0) {\r\n logger.log('Uploading batch', batchNumber, 'of', totalBatches);\r\n let writtenFiles = 0;\r\n const promises = batch.map(async (file) => {\r\n if (filePattern) {\r\n if (!filePattern.test(file.path)) {\r\n logger.log('Skipping file:', file.path);\r\n return;\r\n }\r\n }\r\n\r\n const isAvailableTranslations = file.path.endsWith(\r\n 'available_translations.json'\r\n );\r\n const isAvailableCommentaries = file.path.endsWith(\r\n 'available_commentaries.json'\r\n );\r\n // \"Common\" files are files that are similar between translations, like the books.json endpoint, or individual chapter endpoints.\r\n const isCommonFile =\r\n !isAvailableTranslations && !isAvailableCommentaries;\r\n const isMergedFile =\r\n isAvailableCommentaries || isAvailableTranslations;\r\n if (\r\n await uploader.upload(\r\n file,\r\n overwrite ||\r\n (overwriteCommonFiles && isCommonFile) ||\r\n (isMergedFile && overwriteMergedFiles)\r\n )\r\n ) {\r\n if (options.verbose) {\r\n logger.log('Uploaded file:', file.path);\r\n }\r\n writtenFiles++;\r\n } else if (options.verbose) {\r\n logger.warn('File already exists:', file.path);\r\n logger.warn('Skipping file');\r\n }\r\n\r\n if (file.content instanceof Readable) {\r\n file.content.destroy();\r\n }\r\n });\r\n\r\n await Promise.all(promises);\r\n\r\n logger.log('Wrote', writtenFiles, 'files');\r\n logger.log('Skipped', batch.length - writtenFiles, 'files');\r\n batchNumber++;\r\n offset += batchSize;\r\n batch = files.slice(offset, offset + batchSize);\r\n }\r\n }\r\n}\r\n", "import {\r\n ApiAvailableCommentariesSchema,\r\n ApiAvailableDatasetsSchema,\r\n ApiAvailableTranslationsSchema,\r\n ApiCommentaryBookChapterSchema,\r\n ApiCommentaryBooksSchema,\r\n ApiDatasetBookChapterSchema,\r\n ApiDatasetBooksSchema,\r\n ApiSimpleCommentaryBookChapterSchema,\r\n ApiSimpleTranslationBookChapterSchema,\r\n ApiSimpleTranslationBookChapterWordsSchema,\r\n ApiSimpleTranslationCompleteSchema,\r\n ApiTranslationBookChapterAudioTimingsSchema,\r\n ApiTranslationBookChapterSchema,\r\n ApiTranslationBookChapterWordsSchema,\r\n ApiTranslationBooksSchema,\r\n ApiTranslationCompleteBookSchema,\r\n ApiTranslationCompleteSchema,\r\n} from '@helloao/tools/generation/api.js';\r\nimport { createDocument, ZodOpenApiObject } from 'zod-openapi';\r\nimport { z } from 'zod';\r\nimport { BookIdSchema } from '@helloao/tools/utils.js';\r\n\r\nconst translation = z.string().meta({\r\n description:\r\n 'The translation ID of the Bible translation to get the books for. For example, \"eng_kjv\" for the King James Version.',\r\n});\r\n\r\nconst commentary = z.string().meta({\r\n description:\r\n 'The commentary ID of the commentary to get the books or chapter content for.',\r\n});\r\n\r\nconst dataset = z.string().meta({\r\n description:\r\n 'The dataset ID of the dataset to get the books or chapter content for.',\r\n});\r\n\r\nconst book = BookIdSchema;\r\n\r\nconst chapter = z.number().positive().meta({\r\n description:\r\n 'The chapter number to get the content for. This should be a positive integer.',\r\n});\r\n\r\nconst reader = z.string().meta({\r\n description:\r\n 'The ID of the reader to get the audio timings for. For example, \"hays\" for the Hays reading of the Berean Standard Bible.',\r\n});\r\n\r\nexport function createFreeUseBibleApiOpenApiDocument(): any {\r\n return createDocument({\r\n openapi: '3.1.0',\r\n info: {\r\n title: 'Free Use Bible API',\r\n version: '1.0.0',\r\n description:\r\n 'An API for accessing over 1000 different Bible translations.',\r\n contact: {\r\n name: 'HelloAO',\r\n url: 'https://bible.helloao.org',\r\n email: 'hello@helloao.org',\r\n },\r\n },\r\n servers: [\r\n {\r\n url: 'https://bible.helloao.org',\r\n description: 'Free Use Bible API production server',\r\n },\r\n ],\r\n paths: {\r\n '/api/available_translations.json': {\r\n get: {\r\n operationId: 'getAvailableTranslations',\r\n description:\r\n 'Get the list of available Bible translations.',\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiAvailableTranslationsSchema,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n '/api/{translation}/books.json': {\r\n get: {\r\n operationId: 'getTranslationBooks',\r\n description:\r\n 'Get the list of books available for a specific translation.',\r\n requestParams: {\r\n path: z.object({\r\n translation: translation,\r\n }),\r\n },\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiTranslationBooksSchema,\r\n },\r\n },\r\n },\r\n '404': {\r\n description:\r\n '404 Not Found - The specified translation was not found.',\r\n },\r\n },\r\n },\r\n },\r\n '/api/{translation}/{book}/{chapter}.json': {\r\n get: {\r\n operationId: 'getTranslationBookChapter',\r\n description:\r\n 'Get the content of a specific chapter of a specific book for a specific translation.',\r\n requestParams: {\r\n path: z.object({\r\n translation,\r\n book,\r\n chapter,\r\n }),\r\n },\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiTranslationBookChapterSchema,\r\n },\r\n },\r\n links: {\r\n nextChapter: {\r\n operationId: 'getTranslationBookChapter',\r\n description:\r\n 'Gets the chapter that follows the current chapter in the translation.',\r\n parameters: {\r\n translation:\r\n '$response.body#/nextChapterReference/translationId',\r\n book: '$response.body#/nextChapterReference/book',\r\n chapter:\r\n '$response.body#/nextChapterReference/chapter',\r\n },\r\n },\r\n previousChapter: {\r\n operationId: 'getTranslationBookChapter',\r\n description:\r\n 'Gets the chapter that precedes the current chapter in the translation.',\r\n parameters: {\r\n translation:\r\n '$response.body#/previousChapterReference/translationId',\r\n book: '$response.body#/previousChapterReference/book',\r\n chapter:\r\n '$response.body#/previousChapterReference/chapter',\r\n },\r\n },\r\n },\r\n },\r\n '404': {\r\n description:\r\n '404 Not Found - The specified translation, book, or chapter was not found.',\r\n },\r\n },\r\n },\r\n },\r\n '/api/{translation}/{book}/{chapter}.simple.json': {\r\n get: {\r\n operationId: 'getSimpleTranslationBookChapter',\r\n description:\r\n 'Get the content of a specific chapter of a specific book for a specific translation, using the simplified format. In the simplified format, the content of each verse is a single string instead of a list of formatted content, and the footnotes are available on the verse that they occur in, along with the offset that they occur at.',\r\n requestParams: {\r\n path: z.object({\r\n translation,\r\n book,\r\n chapter,\r\n }),\r\n },\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiSimpleTranslationBookChapterSchema,\r\n },\r\n },\r\n links: {\r\n nextChapter: {\r\n operationId:\r\n 'getSimpleTranslationBookChapter',\r\n description:\r\n 'Gets the chapter that follows the current chapter in the translation.',\r\n parameters: {\r\n translation:\r\n '$response.body#/nextChapterReference/translationId',\r\n book: '$response.body#/nextChapterReference/book',\r\n chapter:\r\n '$response.body#/nextChapterReference/chapter',\r\n },\r\n },\r\n previousChapter: {\r\n operationId:\r\n 'getSimpleTranslationBookChapter',\r\n description:\r\n 'Gets the chapter that precedes the current chapter in the translation.',\r\n parameters: {\r\n translation:\r\n '$response.body#/previousChapterReference/translationId',\r\n book: '$response.body#/previousChapterReference/book',\r\n chapter:\r\n '$response.body#/previousChapterReference/chapter',\r\n },\r\n },\r\n },\r\n },\r\n '404': {\r\n description:\r\n '404 Not Found - The specified translation, book, or chapter was not found.',\r\n },\r\n },\r\n },\r\n },\r\n '/api/{translation}/{book}/{chapter}.{reader}.audioTimings.json':\r\n {\r\n get: {\r\n operationId: 'getTranslationBookChapterAudioTimings',\r\n description:\r\n 'Get the audio timings (per-verse start times, in seconds) for a specific chapter of a specific book for a specific translation and reader.',\r\n requestParams: {\r\n path: z.object({\r\n translation,\r\n book,\r\n chapter,\r\n reader,\r\n }),\r\n },\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiTranslationBookChapterAudioTimingsSchema,\r\n },\r\n },\r\n },\r\n '404': {\r\n description:\r\n '404 Not Found - The specified translation, book, chapter, or reader was not found.',\r\n },\r\n },\r\n },\r\n },\r\n '/api/{translation}/{book}/{chapter}.words.json': {\r\n get: {\r\n operationId: 'getTranslationBookChapterWords',\r\n description:\r\n \"Get the word-level annotations (Strong's numbers and related source data) for a specific chapter of a specific book for a specific translation.\",\r\n requestParams: {\r\n path: z.object({\r\n translation,\r\n book,\r\n chapter,\r\n }),\r\n },\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiTranslationBookChapterWordsSchema,\r\n },\r\n },\r\n },\r\n '404': {\r\n description:\r\n '404 Not Found - The specified translation, book, or chapter was not found, or the chapter does not have any word-level annotations.',\r\n },\r\n },\r\n },\r\n },\r\n '/api/{translation}/{book}/{chapter}.words.simple.json': {\r\n get: {\r\n operationId: 'getSimpleTranslationBookChapterWords',\r\n description:\r\n \"Get the word-level annotations (Strong's numbers and related source data) for a specific chapter of a specific book for a specific translation, with their offsets remapped onto the text of each simplified verse. Use this with the simplified chapter format, since the offsets in the regular annotations are anchored to a verse's content array.\",\r\n requestParams: {\r\n path: z.object({\r\n translation,\r\n book,\r\n chapter,\r\n }),\r\n },\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiSimpleTranslationBookChapterWordsSchema,\r\n },\r\n },\r\n },\r\n '404': {\r\n description:\r\n '404 Not Found - The specified translation, book, or chapter was not found, or the chapter does not have any word-level annotations.',\r\n },\r\n },\r\n },\r\n },\r\n '/api/{translation}/complete.json': {\r\n get: {\r\n operationId: 'getTranslationComplete',\r\n description:\r\n 'Get the complete content of a specific translation.',\r\n requestParams: {\r\n path: z.object({\r\n translation,\r\n }),\r\n },\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiTranslationCompleteSchema,\r\n },\r\n },\r\n },\r\n '404': {\r\n description:\r\n '404 Not Found - The specified translation was not found, or complete translations are not available.',\r\n },\r\n },\r\n },\r\n },\r\n '/api/{translation}/complete.simple.json': {\r\n get: {\r\n operationId: 'getSimpleTranslationComplete',\r\n description:\r\n 'Get the complete content of a specific translation, using the simplified format. In the simplified format, the content of each verse is a single string instead of a list of formatted content, and the footnotes are available on the verse that they occur in, along with the offset that they occur at.',\r\n requestParams: {\r\n path: z.object({\r\n translation,\r\n }),\r\n },\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiSimpleTranslationCompleteSchema,\r\n },\r\n },\r\n },\r\n '404': {\r\n description:\r\n '404 Not Found - The specified translation was not found, or complete translations are not available.',\r\n },\r\n },\r\n },\r\n },\r\n '/api/available_commentaries.json': {\r\n get: {\r\n operationId: 'getAvailableCommentaries',\r\n description: 'Get the list of available commentaries.',\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiAvailableCommentariesSchema,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n '/api/c/{commentary}/books.json': {\r\n get: {\r\n operationId: 'getCommentaryBooks',\r\n description:\r\n 'Get the list of books available for a specific commentary.',\r\n requestParams: {\r\n path: z.object({\r\n commentary,\r\n }),\r\n },\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiCommentaryBooksSchema,\r\n },\r\n },\r\n },\r\n '404': {\r\n description:\r\n '404 Not Found - The specified commentary was not found.',\r\n },\r\n },\r\n },\r\n },\r\n '/api/c/{commentary}/{book}/{chapter}.json': {\r\n get: {\r\n operationId: 'getCommentaryBookChapter',\r\n description:\r\n 'Get the content of a specific chapter of a specific book for a specific commentary.',\r\n requestParams: {\r\n path: z.object({\r\n commentary,\r\n book,\r\n chapter,\r\n }),\r\n },\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiCommentaryBookChapterSchema,\r\n },\r\n },\r\n },\r\n '404': {\r\n description:\r\n '404 Not Found - The specified commentary, book, or chapter was not found.',\r\n },\r\n },\r\n },\r\n },\r\n '/api/c/{commentary}/{book}/{chapter}.simple.json': {\r\n get: {\r\n operationId: 'getSimpleCommentaryBookChapter',\r\n description:\r\n 'Get the content of a specific chapter of a specific book for a specific commentary, using the simplified format. In the simplified format, the content of each verse is a single string instead of a list of formatted content.',\r\n requestParams: {\r\n path: z.object({\r\n commentary,\r\n book,\r\n chapter,\r\n }),\r\n },\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiSimpleCommentaryBookChapterSchema,\r\n },\r\n },\r\n },\r\n '404': {\r\n description:\r\n '404 Not Found - The specified commentary, book, or chapter was not found.',\r\n },\r\n },\r\n },\r\n },\r\n '/api/available_datasets.json': {\r\n get: {\r\n operationId: 'getAvailableDatasets',\r\n description: 'Get the list of available datasets.',\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiAvailableDatasetsSchema,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n },\r\n '/api/d/{dataset}/books.json': {\r\n get: {\r\n operationId: 'getDatasetBooks',\r\n description:\r\n 'Get the list of books available for a specific dataset.',\r\n requestParams: {\r\n path: z.object({\r\n dataset,\r\n }),\r\n },\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiDatasetBooksSchema,\r\n },\r\n },\r\n },\r\n '404': {\r\n description:\r\n '404 Not Found - The specified dataset was not found.',\r\n },\r\n },\r\n },\r\n },\r\n '/api/d/{dataset}/{book}/{chapter}.json': {\r\n get: {\r\n operationId: 'getDatasetBookChapter',\r\n description:\r\n 'Get the content of a specific chapter of a specific book for a specific dataset.',\r\n requestParams: {\r\n path: z.object({\r\n dataset,\r\n book,\r\n chapter,\r\n }),\r\n },\r\n responses: {\r\n '200': {\r\n description: '200 OK',\r\n content: {\r\n 'application/json': {\r\n schema: ApiDatasetBookChapterSchema,\r\n },\r\n },\r\n },\r\n '404': {\r\n description:\r\n '404 Not Found - The specified dataset, book, or chapter was not found.',\r\n },\r\n },\r\n },\r\n },\r\n },\r\n });\r\n}\r\n", "import path, { basename, extname } from 'node:path';\r\nimport * as database from './db.js';\r\nimport Sql, { Database } from 'better-sqlite3';\r\nimport Typesense from 'typesense';\r\nimport { Book, Prisma, PrismaClient } from './prisma-gen/client.js';\r\nimport { DOMParser, Element, Node } from 'linkedom';\r\nimport { mkdir, readdir, rm, writeFile } from 'node:fs/promises';\r\nimport {\r\n getBookId,\r\n getFirstNonEmpty,\r\n normalizeLanguage,\r\n} from '@helloao/tools/utils.js';\r\nimport {\r\n bookOrder,\r\n dataset,\r\n InputTranslationMetadata,\r\n} from '@helloao/tools/generation/index.js';\r\nimport fsExtra from 'fs-extra';\r\nconst { exists, readFile } = fsExtra;\r\nimport { copyFile } from 'node:fs/promises';\r\nimport {\r\n KNOWN_AUDIO_TRANSLATIONS,\r\n KNOWN_AUDIO_FILE_TRANSLATIONS,\r\n} from '@helloao/tools/generation/audio.js';\r\nimport {\r\n bookChapterCountMap,\r\n bookOrderMap,\r\n} from '@helloao/tools/generation/book-order.js';\r\nimport { downloadFile, unzipToDirectory } from './downloads.js';\r\nimport { batch, toAsyncIterable } from '@helloao/tools/parser/iterators.js';\r\nimport {\r\n hashInputFiles,\r\n loadCommentariesFromDirectory,\r\n loadDatasetsFromDirectory,\r\n loadTranslationFiles,\r\n loadTranslationsFiles,\r\n loadTranslationsFromDirectory,\r\n} from './files.js';\r\nimport {\r\n DatasetDataset,\r\n DatasetDatasetBook,\r\n DatasetOutput,\r\n DatasetTranslationBook,\r\n generateDataset,\r\n} from '@helloao/tools/generation/dataset.js';\r\nimport {\r\n serializeAndUploadDatasets,\r\n UploadApiFromDatabaseOptions,\r\n UploadApiOptions,\r\n} from './uploads.js';\r\nimport { getHttpUrl } from './s3.js';\r\nimport { input, select, confirm, checkbox } from '@inquirer/prompts';\r\nimport { isValid } from 'all-iso-language-codes';\r\nimport { log } from '@helloao/tools';\r\nimport { EBibleSource } from './prisma-gen/client.js';\r\nimport { DateTime } from 'luxon';\r\nimport { BlobReader, ZipReader } from '@zip.js/zip.js';\r\nimport { tmpdir } from 'node:os';\r\nimport { existsSync } from 'fs';\r\nimport {\r\n findBibleMultiConverterJar,\r\n promptForBibleMultiConverter,\r\n convertUsfmToUsx3,\r\n} from './conversion.js';\r\nimport { fetchEBibleMetadata } from './ebible.js';\r\nimport { importDatasetOutput } from './db.js';\r\nimport { groupBy } from 'es-toolkit/compat';\r\n\r\nexport interface GetTranslationsItem {\r\n id: string;\r\n language: string;\r\n direction: 'ltr' | 'rtl';\r\n year: number;\r\n name_local: string;\r\n name_english: string;\r\n name_abbrev: string;\r\n attribution: string;\r\n attribution_url: string;\r\n licenses: RuntimeLicense[];\r\n}\r\n\r\nexport interface RuntimeLicense {\r\n id: string | null;\r\n name: string;\r\n restrictions: MetaRestrictions;\r\n url: string;\r\n}\r\n\r\nexport interface MetaRestrictions {\r\n limit_verses: number | null;\r\n limit_book_ratio: number | null;\r\n limit_content_ratio: number | null;\r\n forbid_commercial: boolean;\r\n forbid_derivatives: boolean | 'same-license';\r\n forbid_attributionless: boolean;\r\n forbid_other: boolean;\r\n}\r\n\r\nexport interface InitDbOptions {\r\n /**\r\n * The path to the source database to copy the schema from.\r\n */\r\n source?: string;\r\n\r\n /**\r\n * Whether to overwrite the existing database.\r\n */\r\n overwrite?: boolean;\r\n\r\n /**\r\n * The languages to copy from the source database. If not specified, then all languages will be copied.\r\n */\r\n language?: string[];\r\n}\r\n\r\nexport interface ConvertToUsx3Options {\r\n /**\r\n * Whether to overwrite existing files in output directory.\r\n */\r\n overwrite?: boolean;\r\n}\r\n\r\nexport interface SourceTranslationsOptions {\r\n /**\r\n * Whether to convert USFM files to USX3 format after download.\r\n */\r\n convertToUsx3?: boolean;\r\n\r\n /**\r\n * Options for USX3 conversion.\r\n */\r\n conversionOptions?: ConvertToUsx3Options;\r\n\r\n /**\r\n * Whether to track downloads in database.\r\n */\r\n useDatabase?: boolean;\r\n\r\n /**\r\n * Path to BibleMultiConverter.jar file. If not provided, will search common locations.\r\n */\r\n bibleMultiConverterPath?: string;\r\n\r\n /**\r\n * Whether to overwrite existing files in output directory.\r\n *\r\n * If database tracking is enabled, this will prevent overwriting files that were not tracked in the database.\r\n */\r\n overwrite?: boolean;\r\n\r\n /**\r\n * The database to use for tracking downloads.\r\n */\r\n db?: string | null;\r\n}\r\n\r\nlet dirname = __dirname;\r\nif (!dirname) {\r\n // @ts-ignore\r\n dirname = import.meta.dirname;\r\n}\r\n\r\nlet metaDir: string | null = null;\r\nexport async function getMetaPath() {\r\n if (metaDir) {\r\n return metaDir;\r\n }\r\n const metaPaths = ['../../meta'];\r\n\r\n for (let metaPath of metaPaths) {\r\n const fullPath = path.resolve(dirname, metaPath);\r\n if (await exists(fullPath)) {\r\n metaDir = fullPath;\r\n return fullPath;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Creates metadata.json file in the output directory based on EBible source information.\r\n */\r\nasync function createMetadataJson(\r\n outputDir: string,\r\n source: EBibleSource,\r\n overwrite: boolean = false\r\n): Promise<void> {\r\n const logger = log.getLogger();\r\n const metadataPath = path.resolve(outputDir, 'metadata.json');\r\n\r\n const metadataExists = await exists(metadataPath);\r\n if (!overwrite && metadataExists) {\r\n logger.log(`Metadata file already exists: ${metadataPath}`);\r\n return;\r\n }\r\n const metaDir = await getMetaPath();\r\n\r\n let metadata: InputTranslationMetadata | null = null;\r\n if (metaDir) {\r\n const overridePath = path.resolve(\r\n metaDir,\r\n `${source.translationId}.json`\r\n );\r\n const overrideExists = await exists(overridePath);\r\n if (overrideExists) {\r\n logger.log(`Using override metadata file: ${overridePath}`);\r\n const overrideMetadata = await readFile(overridePath, 'utf-8');\r\n metadata = JSON.parse(overrideMetadata);\r\n }\r\n }\r\n\r\n if (!metadata) {\r\n const language = normalizeLanguage(source.languageCode);\r\n const englishName = getFirstNonEmpty(\r\n source.shortTitle\r\n ?.normalize('NFKC')\r\n ?.replace(/\\p{Diacritic}/gu, '')!,\r\n source.title\r\n );\r\n\r\n let shortName: string | null = null;\r\n if (language === 'eng') {\r\n // for english translations,\r\n // use the uppercase letters of the title\r\n // or translationId\r\n shortName = source.title\r\n .replace(/[^A-Z]/g, '')\r\n .toUpperCase()\r\n .slice(0, 5);\r\n\r\n if (shortName.length <= 2) {\r\n // If the short name is too short, fallback to the default short name\r\n shortName = null;\r\n }\r\n }\r\n\r\n if (!shortName) {\r\n // Skip the language code prefix (e.g., \"eng_\", \"arb_\") and use the rest for the short name\r\n shortName = source.translationId\r\n .toUpperCase()\r\n .replace(/[^A-Z0-9]/g, '')\r\n .slice(3);\r\n }\r\n\r\n metadata = {\r\n id: source.translationId,\r\n name: getFirstNonEmpty(\r\n source.title,\r\n source.shortTitle!,\r\n source.translationId\r\n ),\r\n direction: /rtl/gi.test(source.textDirection ?? 'ltr')\r\n ? 'rtl'\r\n : 'ltr',\r\n englishName: englishName,\r\n language: language,\r\n licenseUrl: `https://ebible.org/Scriptures/details.php?id=${source.id}`,\r\n shortName: shortName,\r\n website: `https://ebible.org/Scriptures/details.php?id=${source.id}`,\r\n };\r\n }\r\n\r\n await writeFile(metadataPath, JSON.stringify(metadata, null, 2));\r\n logger.log(`Created metadata.json: ${metadataPath}`);\r\n}\r\n\r\n/**\r\n * Initializes a new Bible API DB.\r\n * @param dbPath The path to the database. If null or empty, then the \"bible-api.db\" will be used from the current working directory.\r\n * @param options The options for the initialization.\r\n */\r\nexport async function initDb(\r\n dbPath: string | null,\r\n options: InitDbOptions\r\n): Promise<void> {\r\n const logger = log.getLogger();\r\n logger.log('Initializing new Bible API DB...');\r\n\r\n if (options.source) {\r\n if (options.source.startsWith('https://')) {\r\n logger.log('Downloading source database...');\r\n const databasePath = database.getDbPath(dbPath);\r\n let progressIncrement = 0.01;\r\n await downloadFile(options.source, databasePath, (progress) => {\r\n if (progress >= progressIncrement) {\r\n logger.log(`Downloading... ${Math.round(progress * 100)}%`);\r\n progressIncrement += 0.01;\r\n }\r\n });\r\n } else {\r\n const databasePath = database.getDbPath(dbPath);\r\n if (await exists(databasePath)) {\r\n if (!options.overwrite) {\r\n logger.log('Database already exists.');\r\n return;\r\n } else {\r\n logger.log('Overwriting existing database...');\r\n await rm(databasePath);\r\n }\r\n }\r\n const db = new Sql(databasePath, {});\r\n const sourcePath = path.resolve(options.source);\r\n\r\n try {\r\n logger.log('Copying schema from source DB...');\r\n\r\n if (options.language) {\r\n logger.log(\r\n 'Copying only the following languages:',\r\n options.language\r\n );\r\n\r\n const languages = `(${options.language\r\n .map((l: string) => `'${l}'`)\r\n .join(', ')})`;\r\n db.exec(`\r\n ATTACH DATABASE \"${sourcePath}\" AS source;\r\n\r\n CREATE TABLE \"_prisma_migrations\" AS SELECT * FROM source._prisma_migrations;\r\n \r\n CREATE TABLE \"Translation\" AS SELECT * FROM source.Translation\r\n WHERE language IN ${languages};\r\n\r\n CREATE TABLE \"Book\" AS SELECT * FROM source.Book\r\n INNER JOIN source.Translation ON source.Translation.id = source.Book.translationId\r\n WHERE source.Translation.language IN ${languages};\r\n\r\n CREATE TABLE \"Chapter\" AS SELECT * FROM source.Chapter\r\n INNER JOIN source.Translation ON source.Translation.id = source.Chapter.translationId\r\n WHERE source.Translation.language IN ${languages};\r\n\r\n CREATE TABLE \"ChapterVerse\" AS SELECT * FROM source.ChapterVerse\r\n INNER JOIN source.Translation ON source.Translation.id = source.ChapterVerse.translationId\r\n WHERE source.Translation.language IN ${languages};\r\n\r\n CREATE TABLE \"ChapterFootnote\" AS SELECT * FROM source.ChapterFootnote\r\n INNER JOIN source.Translation ON source.Translation.id = source.ChapterFootnote.translationId\r\n WHERE source.Translation.language IN ${languages};\r\n\r\n CREATE TABLE \"ChapterAudioUrl\" AS SELECT * FROM source.ChapterAudioUrl\r\n INNER JOIN source.Translation ON source.Translation.id = source.ChapterAudioUrl.translationId\r\n WHERE source.Translation.language IN ${languages};\r\n\r\n CREATE TABLE \"ChapterAudioTiming\" AS SELECT * FROM source.ChapterAudioTiming\r\n INNER JOIN source.Translation ON source.Translation.id = source.ChapterAudioTiming.translationId\r\n WHERE source.Translation.language IN ${languages};\r\n\r\n CREATE TABLE \"ChapterWords\" AS SELECT * FROM source.ChapterWords\r\n INNER JOIN source.Translation ON source.Translation.id = source.ChapterWords.translationId\r\n WHERE source.Translation.language IN ${languages};\r\n\r\n CREATE TABLE \"Commentary\" AS SELECT * FROM source.Commentary\r\n WHERE language IN ${languages};\r\n\r\n CREATE TABLE \"CommentaryBook\" AS SELECT * FROM source.CommentaryBook\r\n INNER JOIN source.Commentary ON source.Commentary.id = source.CommentaryBook.commentaryId\r\n WHERE source.Commentary.language IN ${languages};\r\n\r\n CREATE TABLE \"CommentaryChapter\" AS SELECT * FROM source.CommentaryChapter\r\n INNER JOIN source.Commentary ON source.Commentary.id = source.CommentaryChapter.commentaryId\r\n WHERE source.Commentary.language IN ${languages};\r\n\r\n CREATE TABLE \"CommentaryChapterVerse\" AS SELECT * FROM source.CommentaryChapterVerse\r\n INNER JOIN source.Commentary ON source.Commentary.id = source.CommentaryChapterVerse.commentaryId\r\n WHERE source.Commentary.language IN ${languages};\r\n\r\n CREATE TABLE \"Dataset\" AS SELECT * FROM source.Dataset\r\n WHERE language IN ${languages};\r\n\r\n CREATE TABLE \"DatasetBook\" AS SELECT * FROM source.DatasetBook\r\n INNER JOIN source.Dataset ON source.Dataset.id = source.DatasetBook.datasetId\r\n WHERE source.Dataset.language IN ${languages};\r\n\r\n CREATE TABLE \"DatasetChapter\" AS SELECT * FROM source.DatasetChapter\r\n INNER JOIN source.Dataset ON source.Dataset.id = source.DatasetChapter.datasetId\r\n WHERE source.Dataset.language IN ${languages};\r\n\r\n CREATE TABLE \"DatasetChapterVerse\" AS SELECT * FROM source.DatasetChapterVerse\r\n INNER JOIN source.Dataset ON source.Dataset.id = source.DatasetChapterVerse.datasetId\r\n WHERE source.Dataset.language IN ${languages};\r\n\r\n CREATE TABLE \"DatasetReference\" AS SELECT * FROM source.DatasetReference\r\n INNER JOIN source.Dataset ON source.Dataset.id = source.DatasetReference.datasetId\r\n WHERE source.Dataset.language IN ${languages};\r\n `);\r\n } else {\r\n db.exec(`\r\n ATTACH DATABASE \"${sourcePath}\" AS source;\r\n\r\n CREATE TABLE \"_prisma_migrations\" AS SELECT * FROM source._prisma_migrations;\r\n CREATE TABLE \"Translation\" AS SELECT * FROM source.Translation;\r\n CREATE TABLE \"Book\" AS SELECT * FROM source.Book;\r\n CREATE TABLE \"Chapter\" AS SELECT * FROM source.Chapter;\r\n CREATE TABLE \"ChapterVerse\" AS SELECT * FROM source.ChapterVerse;\r\n CREATE TABLE \"ChapterFootnote\" AS SELECT * FROM source.ChapterFootnote;\r\n CREATE TABLE \"ChapterAudioUrl\" AS SELECT * FROM source.ChapterAudioUrl;\r\n CREATE TABLE \"ChapterAudioTiming\" AS SELECT * FROM source.ChapterAudioTiming;\r\n CREATE TABLE \"ChapterWords\" AS SELECT * FROM source.ChapterWords;\r\n CREATE TABLE \"Commentary\" AS SELECT * FROM source.Commentary;\r\n CREATE TABLE \"CommentaryBook\" AS SELECT * FROM source.CommentaryBook;\r\n CREATE TABLE \"CommentaryChapter\" AS SELECT * FROM source.CommentaryChapter;\r\n CREATE TABLE \"CommentaryChapterVerse\" AS SELECT * FROM source.CommentaryChapterVerse;\r\n CREATE TABLE \"Dataset\" AS SELECT * FROM source.Dataset;\r\n CREATE TABLE \"DatasetBook\" AS SELECT * FROM source.DatasetBook;\r\n CREATE TABLE \"DatasetChapter\" AS SELECT * FROM source.DatasetChapter;\r\n CREATE TABLE \"DatasetChapterVerse\" AS SELECT * FROM source.DatasetChapterVerse;\r\n CREATE TABLE \"DatasetReference\" AS SELECT * FROM source.DatasetReference;\r\n `);\r\n }\r\n\r\n logger.log('Done.');\r\n } finally {\r\n db.close();\r\n }\r\n }\r\n } else {\r\n const db = await database.getDb(dbPath);\r\n db.close();\r\n }\r\n}\r\n\r\nexport interface ImportTranslationOptions {\r\n /**\r\n * Whether to forcibly import the translations, even if they have already been imported.\r\n */\r\n overwrite?: boolean;\r\n\r\n /**\r\n * The database to import the translations into.\r\n */\r\n db?: string | null;\r\n}\r\n\r\n/**\r\n * Imports a translation from the given directory into the database in the current working directory.\r\n * @param dir The directory that the translation is located in.\r\n * @param dirs Any extra directories that should be imported.\r\n * @param options The options for the import.\r\n */\r\nexport async function importTranslation(\r\n dir: string,\r\n dirs: string[],\r\n options: ImportTranslationOptions\r\n): Promise<void> {\r\n const parser = new DOMParser();\r\n globalThis.DOMParser = DOMParser as any;\r\n globalThis.Element = Element as any;\r\n globalThis.Node = Node as any;\r\n\r\n const db = await database.getDb(options.db);\r\n try {\r\n await database.importTranslations(\r\n db,\r\n [dir, ...dirs],\r\n parser,\r\n !!options.overwrite\r\n );\r\n } finally {\r\n db.close();\r\n }\r\n}\r\n\r\n/**\r\n * Imports all the translations from the given directory into the database in the current working directory.\r\n * @param dir The directory that the translations are located in.\r\n * @param options The options.\r\n */\r\nexport async function importTranslations(\r\n dir: string,\r\n options: ImportTranslationOptions\r\n): Promise<void> {\r\n const logger = log.getLogger();\r\n const parser = new DOMParser();\r\n globalThis.DOMParser = DOMParser as any;\r\n globalThis.Element = Element as any;\r\n globalThis.Node = Node as any;\r\n\r\n const db = await database.getDb(options.db);\r\n try {\r\n const files = await readdir(dir);\r\n const translationDirs = files.map((f) => path.resolve(dir, f));\r\n logger.log(`Importing ${translationDirs.length} translations`);\r\n await database.importTranslations(\r\n db,\r\n translationDirs,\r\n parser,\r\n !!options.overwrite\r\n );\r\n } finally {\r\n db.close();\r\n }\r\n}\r\n\r\n/**\r\n * Imports a commentary from the given directory into the database in the current working directory.\r\n * @param dir The directory that the commentary is located in.\r\n * @param dirs Any extra directories that should be imported.\r\n * @param options The options for the import.\r\n */\r\nexport async function importCommentary(\r\n dir: string,\r\n dirs: string[],\r\n options: ImportTranslationOptions\r\n): Promise<void> {\r\n const parser = new DOMParser();\r\n globalThis.DOMParser = DOMParser as any;\r\n globalThis.Element = Element as any;\r\n globalThis.Node = Node as any;\r\n\r\n const db = await database.getDb(options.db);\r\n try {\r\n await database.importCommentaries(\r\n db,\r\n [dir, ...dirs],\r\n parser,\r\n !!options.overwrite\r\n );\r\n } finally {\r\n db.close();\r\n }\r\n}\r\n\r\n/**\r\n * Imports all the commentaries from the given directory into the database in the current working directory.\r\n * @param dir The directory that the commentaries are located in.\r\n * @param options The options.\r\n */\r\nexport async function importCommentaries(\r\n dir: string,\r\n options: ImportTranslationOptions\r\n): Promise<void> {\r\n const logger = log.getLogger();\r\n const parser = new DOMParser();\r\n globalThis.DOMParser = DOMParser as any;\r\n globalThis.Element = Element as any;\r\n globalThis.Node = Node as any;\r\n\r\n const db = await database.getDb(options.db);\r\n try {\r\n const files = await readdir(dir);\r\n const commentaryDirs = files.map((f) => path.resolve(dir, f));\r\n logger.log(`Importing ${commentaryDirs.length} commentaries`);\r\n await database.importCommentaries(\r\n db,\r\n commentaryDirs,\r\n parser,\r\n !!options.overwrite\r\n );\r\n } finally {\r\n db.close();\r\n }\r\n}\r\n\r\n/**\r\n * Imports the API from the given directory into the database in the current working directory.\r\n * @param dir The directory that the API is located in.\r\n * @param options The options.\r\n */\r\nexport async function importApi(\r\n dir: string,\r\n options: ImportTranslationOptions\r\n) {\r\n const db = await database.getDb(options.db);\r\n try {\r\n const datasets = await loadDatasetsFromDirectory(dir);\r\n const translations = await loadTranslationsFromDirectory(dir);\r\n const commentaries = await loadCommentariesFromDirectory(dir);\r\n importDatasetOutput(db, {\r\n commentaries,\r\n translations,\r\n datasets,\r\n });\r\n } finally {\r\n db.close();\r\n }\r\n}\r\n\r\n/**\r\n * A single chapter's worth of audio timing data to import.\r\n */\r\nexport interface AudioTimingRecord {\r\n /**\r\n * The ID of the translation.\r\n */\r\n translationId: string;\r\n\r\n /**\r\n * The ID of the book.\r\n */\r\n bookId: string;\r\n\r\n /**\r\n * The number of the chapter.\r\n */\r\n chapterNumber: number;\r\n\r\n /**\r\n * The reader that the timings are for.\r\n */\r\n reader: string;\r\n\r\n /**\r\n * The times (in seconds) that each verse starts, in verse order.\r\n */\r\n verses: number[];\r\n}\r\n\r\n/**\r\n * Imports chapter audio timing data from the given JSON file into the database in the\r\n * current working directory.\r\n *\r\n * The file should contain an array of records: `{ translationId, bookId, chapterNumber, reader, verses }`\r\n * where `verses` is an array of numbers (seconds) - one per verse in the chapter, in order.\r\n * @param file The path to the JSON file to import.\r\n * @param options The options.\r\n */\r\nexport async function importAudioTimings(\r\n file: string,\r\n options: ImportTranslationOptions\r\n): Promise<void> {\r\n const logger = log.getLogger();\r\n const records: AudioTimingRecord[] = JSON.parse(\r\n await readFile(file, 'utf-8')\r\n );\r\n\r\n const db = await database.getDb(options.db);\r\n try {\r\n const importTimings = db.transaction(() => {\r\n for (let record of records) {\r\n database.upsertChapterAudioTiming(\r\n db,\r\n record.translationId,\r\n record.bookId,\r\n record.chapterNumber,\r\n record.reader,\r\n record.verses\r\n );\r\n }\r\n });\r\n importTimings();\r\n logger.log(`Imported ${records.length} audio timing records.`);\r\n } finally {\r\n db.close();\r\n }\r\n}\r\n\r\nexport interface FetchTranslationsOptions {\r\n /**\r\n * Fetch all translations. If omitted, only undownloaded translations will be fetched.\r\n */\r\n all?: boolean;\r\n}\r\n\r\n/**\r\n * Fetches the specified audio translations and places them in the given directory.\r\n * Translations should be in the format \"translationId/audioId\". e.g. \"BSB/gilbert\"\r\n * @param dir The directory that the translations should be placed in.\r\n * @param translations The translations that should be downloaded.\r\n * @param options The options.\r\n */\r\nexport async function fetchAudio(\r\n dir: string,\r\n translations: string[],\r\n options: FetchTranslationsOptions = {}\r\n): Promise<void> {\r\n const logger = log.getLogger();\r\n for (let translation of translations) {\r\n const [translationId, reader] = translation.split('/');\r\n const generator =\r\n KNOWN_AUDIO_TRANSLATIONS.get(translationId)?.get(reader);\r\n\r\n if (!generator) {\r\n logger.warn('Unknown translation:', translation);\r\n continue;\r\n }\r\n\r\n for (let [bookId, chapters] of bookChapterCountMap) {\r\n for (let chapter = 1; chapter <= chapters; chapter++) {\r\n const url = generator(bookId, chapter);\r\n const ext = extname(url);\r\n\r\n const [translationId, reader] = translation.split('/');\r\n\r\n const name = `${chapter}.${reader}${ext}`;\r\n const fullPath = path.resolve(\r\n dir,\r\n 'audio',\r\n translationId,\r\n bookId,\r\n name\r\n );\r\n\r\n if (!options.all && (await exists(fullPath))) {\r\n continue;\r\n }\r\n\r\n await downloadFile(url, fullPath);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Generates the translation files directly from the translations stored in the given input directory.\r\n * @param input The input directory that the translations are stored in.\r\n * @param dest The destination to upload the API files to.\r\n * @param options The options for the generation.\r\n */\r\nexport async function generateTranslationsFiles(\r\n input: string,\r\n dest: string,\r\n options: UploadApiFromDatabaseOptions\r\n): Promise<void> {\r\n const parser = new DOMParser();\r\n globalThis.DOMParser = DOMParser as any;\r\n globalThis.Element = Element as any;\r\n globalThis.Node = Node as any;\r\n\r\n const dirs = await readdir(path.resolve(input));\r\n const batchSize =\r\n typeof options.batchSize === 'number'\r\n ? options.batchSize\r\n : parseInt(options.batchSize);\r\n for (let b of batch(dirs, batchSize)) {\r\n const files = await loadTranslationsFiles(b);\r\n const dataset = generateDataset(files, parser as any);\r\n await serializeAndUploadDatasets(\r\n dest,\r\n toAsyncIterable([dataset]),\r\n options\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Instructions for manual USFM to USX3 conversion using BibleMultiConverter\r\n */\r\nexport const CONVERSION_INSTRUCTIONS = {\r\n downloadUrl: 'https://github.com/schierlm/BibleMultiConverter/releases',\r\n javaRequirement: 'Java 8 or higher required',\r\n\r\n getConversionCommand: (\r\n inputDir: string,\r\n outputDir: string,\r\n filenamePattern: string = '*.usx'\r\n ) => {\r\n return `java -jar BibleMultiConverter.jar ParatextConverter USFM \"${inputDir}\" USX3 \"${outputDir}\" \"${filenamePattern}\"`;\r\n },\r\n\r\n examples: {\r\n windows:\r\n 'java -jar BibleMultiConverter.jar ParatextConverter USFM \"C:\\\\input\\\\usfm\" USX3 \"C:\\\\output\\\\usx3\" \"*.usx\"',\r\n unix: 'java -jar BibleMultiConverter.jar ParatextConverter USFM \"/path/to/input/usfm\" USX3 \"/path/to/output/usx3\" \"*.usx\"',\r\n },\r\n};\r\n\r\n/**\r\n * Prints conversion instructions for the user\r\n */\r\nexport function printConversionInstructions(): void {\r\n const logger = log.getLogger();\r\n logger.log('\\n=== MANUAL CONVERSION REQUIRED ===');\r\n logger.log('Automatic conversion is not available.');\r\n logger.log('');\r\n logger.log('To enable automatic conversion, please:');\r\n logger.log('1. Download BibleMultiConverter.zip from:');\r\n logger.log(` ${CONVERSION_INSTRUCTIONS.downloadUrl}`);\r\n logger.log('');\r\n logger.log('2. Extract the zip file to one of these locations:');\r\n logger.log(' \u2022 Current directory (./BibleMultiConverter/)');\r\n logger.log(' \u2022 Tools subdirectory (./tools/BibleMultiConverter/)');\r\n logger.log(' \u2022 Parent directory (../BibleMultiConverter/)');\r\n logger.log(\r\n ' \u2022 Or extract anywhere and provide the JAR path when prompted'\r\n );\r\n logger.log('');\r\n logger.log('3. Ensure Java 8+ is installed');\r\n logger.log('');\r\n logger.log('4. Re-run this command with the --convertToUsx3 option');\r\n logger.log('');\r\n logger.log('==========================================\\n');\r\n}\r\n\r\n/**\r\n * Helper function to check if a translation ID matches a source\r\n */\r\nfunction matchesTranslation(\r\n translationQuery: string,\r\n source: EBibleSource\r\n): boolean {\r\n const lowerQuery = translationQuery.toLowerCase();\r\n const lowerSourceId = source.id.toLowerCase();\r\n const lowerTranslationId = source.translationId.toLowerCase();\r\n\r\n const exactMatch =\r\n translationQuery === source.translationId ||\r\n translationQuery === source.id;\r\n const caseInsensitiveMatch =\r\n lowerQuery === lowerTranslationId || lowerQuery === lowerSourceId;\r\n const partialMatch =\r\n lowerSourceId.includes(lowerQuery) ||\r\n lowerTranslationId.includes(lowerQuery);\r\n\r\n return exactMatch || caseInsensitiveMatch || partialMatch;\r\n}\r\n\r\n/**\r\n * Groups sources by which translation query they match\r\n */\r\nfunction groupSourcesByTranslation(\r\n sources: EBibleSource[],\r\n translationQueries: string[]\r\n): Map<string, EBibleSource[]> {\r\n const groups = new Map<string, EBibleSource[]>();\r\n\r\n for (const query of translationQueries) {\r\n const matchingSources = sources.filter((source) =>\r\n matchesTranslation(query, source)\r\n );\r\n if (matchingSources.length > 0) {\r\n groups.set(query, matchingSources);\r\n }\r\n }\r\n\r\n return groups;\r\n}\r\n\r\n/**\r\n * Handles source selection for a single translation query\r\n */\r\nasync function selectSourcesForTranslation(\r\n translationQuery: string,\r\n sources: EBibleSource[]\r\n): Promise<EBibleSource[]> {\r\n const logger = log.getLogger();\r\n if (sources.length === 0) {\r\n logger.log(`No sources found for translation: ${translationQuery}`);\r\n return [];\r\n }\r\n\r\n if (sources.length === 1) {\r\n logger.log(\r\n `Found 1 source for '${translationQuery}': ${sources[0].id} -> ${sources[0].translationId} | ${sources[0].title}`\r\n );\r\n logger.log(`Automatically selecting: ${sources[0].id}`);\r\n return sources;\r\n }\r\n\r\n // Multiple sources found - prompt user\r\n logger.log(`\\nFound ${sources.length} sources for '${translationQuery}':`);\r\n sources.forEach((source, index) => {\r\n logger.log(\r\n ` ${index + 1}. ${source.id} -> ${source.translationId} | ${source.title} | ${source.languageCode}`\r\n );\r\n });\r\n\r\n const SELECT_ALL_VALUE = -1;\r\n const choices = [\r\n ...sources.map((source, index) => ({\r\n name: `${source.id} -> ${source.translationId} | ${source.title} | ${source.languageCode}`,\r\n value: index,\r\n checked: false,\r\n })),\r\n { name: 'Select All', value: SELECT_ALL_VALUE, checked: false },\r\n ];\r\n\r\n const selectedIndices: number[] = await checkbox({\r\n message: `Select sources for '${translationQuery}' (use space to select, enter to confirm):`,\r\n choices: choices,\r\n validate: (choices: readonly { value: number }[]) => {\r\n if (choices.length === 0) {\r\n return 'Please select at least one source or \"Select All\"';\r\n }\r\n return true;\r\n },\r\n });\r\n\r\n // Handle selection\r\n if (selectedIndices.includes(SELECT_ALL_VALUE)) {\r\n logger.log(\r\n `Selected all ${sources.length} sources for '${translationQuery}'.`\r\n );\r\n return sources;\r\n } else {\r\n const selectedSources = selectedIndices\r\n .filter((index: number) => index !== SELECT_ALL_VALUE)\r\n .map((index: number) => sources[index]);\r\n logger.log(\r\n `Selected ${selectedSources.length} sources for '${translationQuery}'.`\r\n );\r\n return selectedSources;\r\n }\r\n}\r\n\r\n/**\r\n * Downloads and processes USFM files from eBible.org.\r\n * Can optionally convert to USX3 format and/or track in database.\r\n */\r\nexport async function sourceTranslations(\r\n outputDir: string,\r\n translations?: string[],\r\n options: SourceTranslationsOptions = {}\r\n): Promise<void> {\r\n const logger = log.getLogger();\r\n let {\r\n convertToUsx3 = false,\r\n useDatabase = true, // Default to true\r\n bibleMultiConverterPath,\r\n overwrite = false,\r\n } = options;\r\n\r\n logger.log('Fetching eBible metadata...');\r\n const ebibleSources = await fetchEBibleMetadata();\r\n logger.log(`Total eBible sources found: ${ebibleSources.length}`);\r\n\r\n logger.log('');\r\n if (useDatabase) {\r\n logger.log('DATABASE TRACKING: ENABLED');\r\n logger.log(' \u2022 Will check existing downloads in database');\r\n logger.log(' \u2022 Will skip already downloaded sources');\r\n logger.log(' \u2022 Will update database with download information');\r\n } else {\r\n logger.log('DATABASE TRACKING: DISABLED');\r\n logger.log(' \u2022 All matching sources will be processed');\r\n logger.log(' \u2022 No database filtering or updates will be performed');\r\n logger.log(' \u2022 Downloads may overwrite existing files');\r\n }\r\n logger.log('');\r\n\r\n // Basic source validation and translation matching\r\n let filteredSources = ebibleSources.filter((source) => {\r\n if (!source.FCBHID) {\r\n return false;\r\n }\r\n // If translations are specified, must match at least one\r\n if (\r\n translations &&\r\n translations.length > 0 &&\r\n !translations.some((t) => matchesTranslation(t, source))\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n let db: any = null;\r\n let sourceExists: any = null;\r\n let sourceUpsert: any = null;\r\n\r\n let ignorelist: string[] = [];\r\n const ignorelistPath = path.resolve(outputDir, 'ignorelist.txt');\r\n if (await exists(ignorelistPath)) {\r\n const ignorelistContent = await readFile(ignorelistPath, 'utf-8');\r\n ignorelist = ignorelistContent\r\n .split('\\n')\r\n .map((line) => line.trim())\r\n .filter((line) => line.length > 0 && !line.startsWith('#'));\r\n }\r\n\r\n if (ignorelist.length > 0) {\r\n logger.log(\r\n `Applying ignorelist from ${ignorelistPath}: ${ignorelist.length} entries`\r\n );\r\n filteredSources = filteredSources.filter(\r\n (source) => !ignorelist.includes(source.id)\r\n );\r\n }\r\n\r\n // Database-based filtering (if database is enabled)\r\n if (useDatabase) {\r\n if (!overwrite) {\r\n // overwrite existing files\r\n overwrite = true;\r\n console.warn(\r\n 'Overwriting files is enabled due to database tracking.'\r\n );\r\n }\r\n\r\n logger.log('Connecting to database for download tracking...');\r\n db = await database.getDb(options.db);\r\n sourceExists = db.prepare(\r\n 'SELECT usfmZipEtag, usfmDownloadDate FROM EBibleSource WHERE id = @id AND sha256 = @sha256;'\r\n );\r\n let skippedByDatabase = 0;\r\n let sourcesChecked = 0;\r\n let notDownloaded = 0;\r\n\r\n filteredSources = filteredSources.filter((source) => {\r\n const existingSource = sourceExists.get(source) as {\r\n usfmZipEtag: string;\r\n usfmDownloadDate: string;\r\n };\r\n sourcesChecked++;\r\n if (existingSource) {\r\n if (!existingSource.usfmDownloadDate) {\r\n notDownloaded++;\r\n return true;\r\n }\r\n source.usfmZipEtag = existingSource.usfmZipEtag;\r\n source.usfmDownloadDate =\r\n existingSource.usfmDownloadDate as any;\r\n\r\n // If specific translations were requested, include sources that match\r\n if (\r\n translations &&\r\n translations.length > 0 &&\r\n translations.some((t) => matchesTranslation(t, source))\r\n ) {\r\n return true;\r\n }\r\n\r\n skippedByDatabase++;\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n if (skippedByDatabase > 0) {\r\n logger.log(\r\n `Database filtering: Skipped ${skippedByDatabase} already downloaded sources.`\r\n );\r\n } else {\r\n logger.log(`Database filtering: No sources were skipped.`);\r\n }\r\n\r\n logger.log(`Database filtering:`);\r\n logger.log(` \u2022 Checked: ${sourcesChecked}`);\r\n logger.log(` \u2022 Skipped: ${skippedByDatabase}`);\r\n logger.log(` \u2022 New: ${notDownloaded}`);\r\n logger.log(\r\n ` \u2022 Needs Update: ${filteredSources.length - notDownloaded}`\r\n );\r\n\r\n sourceUpsert = db.prepare(`INSERT INTO EBibleSource(\r\n id, translationId, title, shortTitle, languageCode, textDirection, copyright, description,\r\n oldTestamentBooks, oldTestamentChapters, oldTestamentVerses,\r\n newTestamentBooks, newTestamentChapters, newTestamentVerses,\r\n apocryphaBooks, apocryphaChapters, apocryphaVerses,\r\n redistributable, sourceDate, updateDate, usfmDownloadDate,\r\n usfmDownloadPath, sha256, usfmZipUrl, usfmZipEtag, FCBHID\r\n ) VALUES (\r\n @id, @translationId, @title, @shortTitle, @languageCode, @textDirection, @copyright, @description,\r\n @oldTestamentBooks, @oldTestamentChapters, @oldTestamentVerses,\r\n @newTestamentBooks, @newTestamentChapters, @newTestamentVerses,\r\n @apocryphaBooks, @apocryphaChapters, @apocryphaVerses,\r\n @redistributable, @sourceDate, @updateDate, @usfmDownloadDate,\r\n @usfmDownloadPath, @sha256, @usfmZipUrl, @usfmZipEtag, @FCBHID\r\n ) ON CONFLICT(id) DO UPDATE SET\r\n translationId = excluded.translationId, title = excluded.title, shortTitle = excluded.shortTitle,\r\n languageCode = excluded.languageCode, textDirection = excluded.textDirection, copyright = excluded.copyright,\r\n description = excluded.description, oldTestamentBooks = excluded.oldTestamentBooks,\r\n oldTestamentChapters = excluded.oldTestamentChapters, oldTestamentVerses = excluded.oldTestamentVerses,\r\n newTestamentBooks = excluded.newTestamentBooks, newTestamentChapters = excluded.newTestamentChapters,\r\n newTestamentVerses = excluded.newTestamentVerses, apocryphaBooks = excluded.apocryphaBooks,\r\n apocryphaChapters = excluded.apocryphaChapters, apocryphaVerses = excluded.apocryphaVerses,\r\n redistributable = excluded.redistributable, sourceDate = excluded.sourceDate,\r\n updateDate = excluded.updateDate, usfmDownloadDate = excluded.usfmDownloadDate,\r\n usfmDownloadPath = excluded.usfmDownloadPath, sha256 = excluded.sha256,\r\n usfmZipUrl = excluded.usfmZipUrl, usfmZipEtag = excluded.usfmZipEtag,\r\n FCBHID = excluded.FCBHID;\r\n `);\r\n } else {\r\n logger.log('Database connection skipped (tracking disabled)');\r\n }\r\n\r\n logger.log(`Found ${filteredSources.length} sources to process`);\r\n\r\n // Handle source selection based on whether specific translations were requested\r\n let selectedSources: EBibleSource[] = [];\r\n\r\n if (translations && translations.length > 0) {\r\n const sourceGroups = groupSourcesByTranslation(\r\n filteredSources,\r\n translations\r\n );\r\n\r\n if (sourceGroups.size === 0) {\r\n logger.log(\r\n 'No matching sources found for any of the specified translations.'\r\n );\r\n logger.log(\r\n 'Tip: Use the \"list-ebible-translations\" command to find available translations.'\r\n );\r\n return;\r\n }\r\n\r\n logger.log(`Processing ${sourceGroups.size} translation(s)...\\n`);\r\n\r\n for (const [translationQuery, sources] of sourceGroups) {\r\n const selected = await selectSourcesForTranslation(\r\n translationQuery,\r\n sources\r\n );\r\n selectedSources.push(...selected);\r\n }\r\n\r\n if (selectedSources.length === 0) {\r\n logger.log('No sources selected for download.');\r\n return;\r\n }\r\n\r\n logger.log(\r\n `\\nTotal selected: ${selectedSources.length} sources from ${sourceGroups.size} translation(s).`\r\n );\r\n } else {\r\n // No specific translations requested - use all filtered sources\r\n selectedSources = filteredSources;\r\n if (selectedSources.length === 0) {\r\n logger.log('No sources found.');\r\n return;\r\n }\r\n }\r\n\r\n // temporary directory path for USFM downloads\r\n const tempDir = path.join(\r\n tmpdir(),\r\n 'bible-api',\r\n 'ebible',\r\n 'usfm-downloads'\r\n );\r\n\r\n try {\r\n const downloadBatches: EBibleSource[][] = [];\r\n const downloadBatchSize = 50;\r\n const conversionBatchSize = 10;\r\n\r\n while (selectedSources.length > 0) {\r\n downloadBatches.push(selectedSources.splice(0, downloadBatchSize));\r\n }\r\n\r\n let numDownloaded = 0;\r\n let numErrored = 0;\r\n let numConverted = 0;\r\n let conversionsNeeded: Array<{\r\n tempPath: string;\r\n outputPath: string;\r\n source: EBibleSource;\r\n }> = [];\r\n // Try to find BibleMultiConverter.jar\r\n let jarPath = await findBibleMultiConverterJar(bibleMultiConverterPath);\r\n\r\n if (!jarPath && convertToUsx3) {\r\n jarPath = await promptForBibleMultiConverter();\r\n }\r\n\r\n if (!jarPath && convertToUsx3) {\r\n logger.error(\r\n 'BibleMultiConverter JAR not found. Cannot convert USFM to USX3.'\r\n );\r\n printConversionInstructions();\r\n return;\r\n }\r\n\r\n console.log(\r\n `Processing ${downloadBatches.length} batches of ${downloadBatchSize} sources each.`\r\n );\r\n\r\n for (let i = 0; i < downloadBatches.length; i++) {\r\n const sources = downloadBatches[i];\r\n logger.log(\r\n `Processing batch ${i + 1} of ${downloadBatches.length}`\r\n );\r\n await Promise.all(\r\n sources.map(async (source) => {\r\n try {\r\n logger.log(`Processing: ${source.translationId}`);\r\n\r\n // Check if USFM zip file exists\r\n const detailsPage = await fetch(\r\n `https://ebible.org/Scriptures/details.php?id=${source.id}`\r\n );\r\n const detailsHtml = await detailsPage.text();\r\n const hasUsfm = detailsHtml.includes(\r\n `${source.id}_usfm.zip`\r\n );\r\n\r\n if (hasUsfm) {\r\n const usfmZipUrl = `https://ebible.org/Scriptures/${source.id}_usfm.zip`;\r\n source.usfmZipUrl = usfmZipUrl;\r\n\r\n const usfmResult = await fetch(usfmZipUrl);\r\n\r\n if (usfmResult.status === 404) {\r\n source.usfmZipUrl = null;\r\n } else if (usfmResult.status === 200) {\r\n source.usfmZipEtag =\r\n usfmResult.headers.get('etag') || null;\r\n\r\n // Use temp directory for USFM files if converting, otherwise use final output directory\r\n const finalOutputPath = path.resolve(\r\n outputDir,\r\n source.translationId\r\n );\r\n const downloadDir = convertToUsx3\r\n ? path.resolve(\r\n tempDir,\r\n source.translationId\r\n )\r\n : path.resolve(\r\n outputDir,\r\n source.translationId\r\n );\r\n\r\n if (overwrite) {\r\n if (existsSync(downloadDir)) {\r\n logger.log(\r\n `Overwriting existing directory: ${downloadDir}`\r\n );\r\n await rm(downloadDir, {\r\n recursive: true,\r\n force: true,\r\n });\r\n }\r\n\r\n if (existsSync(finalOutputPath)) {\r\n logger.log(\r\n `Overwriting existing directory: ${downloadDir}`\r\n );\r\n await rm(downloadDir, {\r\n recursive: true,\r\n force: true,\r\n });\r\n }\r\n }\r\n\r\n await mkdir(downloadDir, { recursive: true });\r\n await mkdir(finalOutputPath, {\r\n recursive: true,\r\n });\r\n\r\n const reader = new BlobReader(\r\n await usfmResult.blob()\r\n );\r\n const zip = new ZipReader(reader);\r\n const usfmFileCount = await unzipToDirectory(\r\n zip,\r\n downloadDir,\r\n overwrite,\r\n (entry) => entry.filename.endsWith('.usfm')\r\n );\r\n\r\n // Create metadata in output directory\r\n await createMetadataJson(\r\n finalOutputPath,\r\n source,\r\n overwrite\r\n );\r\n\r\n if (convertToUsx3) {\r\n if (usfmFileCount > 0) {\r\n // convert USFM files to USX3 format\r\n conversionsNeeded.push({\r\n tempPath: downloadDir,\r\n outputPath: finalOutputPath,\r\n source,\r\n });\r\n } else {\r\n logger.warn(\r\n `No USFM files found for ${source.translationId}.`\r\n );\r\n }\r\n } else {\r\n source.usfmDownloadDate =\r\n DateTime.utc().toISO() as any;\r\n source.usfmDownloadPath = finalOutputPath;\r\n }\r\n\r\n numDownloaded++;\r\n } else {\r\n numErrored += 1;\r\n }\r\n } else {\r\n logger.warn(\r\n `No USFM zip found for ${source.translationId}. Skipping.`\r\n );\r\n numErrored++;\r\n return;\r\n }\r\n\r\n if (!convertToUsx3) {\r\n source.usfmDownloadDate =\r\n DateTime.utc().toISO() as any;\r\n source.usfmDownloadPath = outputDir;\r\n if (sourceUpsert) {\r\n sourceUpsert.run(source);\r\n }\r\n }\r\n } catch (error) {\r\n numErrored++;\r\n logger.error(\r\n `Error processing ${source.translationId}:`,\r\n error\r\n );\r\n }\r\n })\r\n );\r\n }\r\n\r\n // Enhanced summary with database tracking info\r\n logger.log('');\r\n logger.log('DOWNLOAD SUMMARY:');\r\n logger.log(` Downloaded: ${numDownloaded} sources`);\r\n logger.log(` Errored: ${numErrored} sources`);\r\n logger.log('');\r\n\r\n if (convertToUsx3 && conversionsNeeded.length > 0) {\r\n logger.log(\r\n `${conversionsNeeded.length} translations need conversion to USX3.`\r\n );\r\n\r\n logger.log(`Starting automatic conversion using: ${jarPath}`);\r\n\r\n const conversionBatches = [];\r\n while (conversionsNeeded.length > 0) {\r\n conversionBatches.push(\r\n conversionsNeeded.splice(0, conversionBatchSize)\r\n );\r\n }\r\n\r\n logger.log(\r\n `Processing ${conversionBatches.length} conversion batches of ${conversionBatchSize} each.`\r\n );\r\n\r\n for (let i = 0; i < conversionBatches.length; i++) {\r\n logger.log(\r\n `Processing conversion batch ${i + 1} of ${conversionBatches.length}`\r\n );\r\n const sources = conversionBatches[i];\r\n await Promise.all(\r\n sources.map(async ({ tempPath, outputPath, source }) => {\r\n logger.log(`Converting ${source.translationId}...`);\r\n\r\n const success = await convertUsfmToUsx3(\r\n tempPath,\r\n outputPath,\r\n jarPath!\r\n );\r\n\r\n if (success) {\r\n if (sourceUpsert) {\r\n source.usfmDownloadDate =\r\n DateTime.utc().toISO() as any;\r\n source.usfmDownloadPath = outputPath;\r\n sourceUpsert.run(source);\r\n }\r\n numConverted++;\r\n } else {\r\n numErrored++;\r\n }\r\n })\r\n );\r\n }\r\n\r\n // Clean up temp directory\r\n if (tempDir && existsSync(tempDir)) {\r\n logger.log(`Cleaning up temporary directory: ${tempDir}`);\r\n await rm(tempDir, { recursive: true, force: true });\r\n }\r\n\r\n logger.log(`CONVERSION SUMMARY:`);\r\n logger.log(` Converted: ${numConverted}`);\r\n logger.log(` Errored: ${numErrored}`);\r\n } else {\r\n logger.log(\r\n 'Conversion to USX3 was skipped or no conversions were needed.'\r\n );\r\n }\r\n } finally {\r\n if (db) {\r\n db.close();\r\n }\r\n }\r\n}\r\n\r\nexport async function listEBibleTranslations(\r\n searchTerm?: string\r\n): Promise<void> {\r\n const logger = log.getLogger();\r\n logger.log('Fetching eBible translation list...');\r\n const ebibleSources = await fetchEBibleMetadata();\r\n\r\n let filteredSources = ebibleSources;\r\n\r\n if (searchTerm) {\r\n const search = searchTerm.toLowerCase();\r\n filteredSources = ebibleSources.filter(\r\n (source) =>\r\n source.id.toLowerCase().includes(search) ||\r\n source.translationId.toLowerCase().includes(search) ||\r\n source.title.toLowerCase().includes(search) ||\r\n source.languageCode.toLowerCase().includes(search)\r\n );\r\n logger.log(\r\n `Found ${filteredSources.length} translations matching \"${searchTerm}\":`\r\n );\r\n } else {\r\n logger.log(\r\n `All ${filteredSources.length} available eBible translations:`\r\n );\r\n }\r\n\r\n logger.log('Format: [ID] -> [TranslationID] | [Title] | [Language]');\r\n logger.log('\u2500'.repeat(80));\r\n\r\n filteredSources.forEach((source) => {\r\n logger.log(\r\n `${source.id} -> ${source.translationId} | ${source.title} | ${source.languageCode}`\r\n );\r\n });\r\n\r\n if (searchTerm && filteredSources.length === 0) {\r\n logger.log('No translations found. Try a different search term.');\r\n logger.log(\r\n 'Tip: Try searching for language codes like \"en\", \"es\", \"fr\", etc.'\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Generates the translation files directly from the translation stored in the given input directory.\r\n * @param input The input directory that the translation is stored in.\r\n * @param dest The destination to upload the API files to.\r\n * @param options The options for the generation.\r\n */\r\nexport async function generateTranslationFiles(\r\n input: string,\r\n dest: string,\r\n options: UploadApiOptions\r\n): Promise<void> {\r\n const logger = log.getLogger();\r\n const parser = new DOMParser();\r\n globalThis.DOMParser = DOMParser as any;\r\n globalThis.Element = Element as any;\r\n globalThis.Node = Node as any;\r\n\r\n const files = await loadTranslationFilesOrAskForMetadata(\r\n path.resolve(input)\r\n );\r\n if (!files) {\r\n logger.log('No translation files found.');\r\n return;\r\n }\r\n\r\n const dataset = generateDataset(files, parser as any);\r\n await serializeAndUploadDatasets(dest, toAsyncIterable([dataset]), options);\r\n}\r\n\r\n/**\r\n * The options for uploading the test translations.\r\n */\r\nexport interface UploadTestTranslationOptions extends UploadApiOptions {\r\n /**\r\n * The s3 URL to upload the translations to.\r\n * Defaults to \"s3://ao-bible-api-public-uploads\"\r\n */\r\n s3Url?: string;\r\n\r\n /**\r\n * The metadata that should be used for the translation.\r\n */\r\n translationMetadata?: InputTranslationMetadata;\r\n\r\n /**\r\n * The map of book IDs to common names.\r\n */\r\n bookNameMap?: Map<string, { commonName: string }>;\r\n}\r\n\r\nexport interface UploadTestTranslationResult {\r\n /**\r\n * The S3 URL where the translations were uploaded to.\r\n */\r\n uploadS3Url: string;\r\n\r\n /**\r\n * The HTTP URL that the version can be accessed at.\r\n */\r\n url: string;\r\n\r\n /**\r\n * The URL that the available translations can be accessed at.\r\n */\r\n availableTranslationsUrl: string;\r\n\r\n /**\r\n * The version that was uploaded.\r\n * This is a SHA-256 hash of the input files.\r\n */\r\n version: string;\r\n}\r\n\r\n/**\r\n * Generates the API files directly from the translations stored in the given input directory and\r\n * uploads them to the HelloAO test s3 bucket.\r\n *\r\n * Requires access to the HelloAO test s3 bucket. Email hello@helloao.org for access.\r\n *\r\n * @param input The input directory that the translations are stored in.\r\n * @param options The options to use for the upload.\r\n */\r\nexport async function uploadTestTranslations(\r\n input: string,\r\n options: UploadTestTranslationOptions\r\n): Promise<UploadTestTranslationResult> {\r\n const parser = new DOMParser();\r\n globalThis.DOMParser = DOMParser as any;\r\n globalThis.Element = Element as any;\r\n globalThis.Node = Node as any;\r\n\r\n const dirs = await readdir(path.resolve(input));\r\n const files = await loadTranslationsFiles(dirs);\r\n const hash = hashInputFiles(files);\r\n\r\n const dataset = generateDataset(files, parser as any, options.bookNameMap);\r\n const url = options.s3Url || 's3://ao-bible-api-public-uploads';\r\n\r\n await serializeAndUploadDatasets(url, toAsyncIterable([dataset]), {\r\n ...options,\r\n pathPrefix: `/${hash}`,\r\n });\r\n\r\n const urls = getUrls(url);\r\n\r\n return {\r\n ...urls,\r\n version: hash,\r\n availableTranslationsUrl: `${urls.url}/${hash}/api/available_translations.json`,\r\n };\r\n}\r\n\r\n/**\r\n * Generates the API files directly from the given translation and\r\n * uploads them to the HelloAO test s3 bucket.\r\n *\r\n * Requires access to the HelloAO test s3 bucket. Email hello@helloao.org for access.\r\n *\r\n * @param input The input directory that the translations are stored in.\r\n * @param options The options to use for the upload.\r\n */\r\nexport async function uploadTestTranslation(\r\n input: string,\r\n options: UploadTestTranslationOptions\r\n): Promise<UploadTestTranslationResult | undefined> {\r\n const logger = log.getLogger();\r\n const parser = new DOMParser();\r\n globalThis.DOMParser = DOMParser as any;\r\n globalThis.Element = Element as any;\r\n globalThis.Node = Node as any;\r\n\r\n const inputPath = path.resolve(input);\r\n const files = await loadTranslationFilesOrAskForMetadata(\r\n inputPath,\r\n options.translationMetadata\r\n );\r\n\r\n if (!files || files.length <= 0) {\r\n logger.log('No translation files found.');\r\n return;\r\n }\r\n\r\n const hash = hashInputFiles(files);\r\n const dataset = generateDataset(files, parser as any, options.bookNameMap);\r\n const url = options.s3Url || 's3://ao-bible-api-public-uploads';\r\n\r\n await serializeAndUploadDatasets(url, toAsyncIterable([dataset]), {\r\n ...options,\r\n pathPrefix: `/${hash}`,\r\n });\r\n\r\n const urls = getUrls(url);\r\n\r\n return {\r\n ...urls,\r\n version: hash,\r\n availableTranslationsUrl: `${urls.url}/${hash}/api/available_translations.json`,\r\n };\r\n}\r\n\r\nfunction getUrls(dest: string) {\r\n const url = getHttpUrl(dest);\r\n\r\n return {\r\n uploadS3Url: dest,\r\n url: url as string,\r\n };\r\n}\r\n\r\nasync function loadTranslationFilesOrAskForMetadata(\r\n dir: string,\r\n translationMetadata?: InputTranslationMetadata\r\n) {\r\n const logger = log.getLogger();\r\n let files = await loadTranslationFiles(dir, translationMetadata);\r\n\r\n if (!files) {\r\n logger.log(`No metadata found for the translation in ${dir}`);\r\n\r\n const enterMetadata = await confirm({\r\n message: 'Do you want to enter the metadata for the translation?',\r\n });\r\n\r\n if (!enterMetadata) {\r\n return null;\r\n }\r\n\r\n const defaultId = basename(dir);\r\n const metadata = await askForMetadata(defaultId);\r\n\r\n const saveMetadata = await confirm({\r\n message: 'Do you want to save this metadata?',\r\n });\r\n\r\n if (saveMetadata) {\r\n await writeFile(\r\n path.resolve(dir, 'metadata.json'),\r\n JSON.stringify(metadata, null, 2)\r\n );\r\n }\r\n\r\n files = await loadTranslationFiles(dir);\r\n }\r\n\r\n return files;\r\n}\r\n\r\n/**\r\n * Asks the user for the metadata for the translation.\r\n */\r\nexport interface UploadTypesenseVersesOptions {\r\n translations?: string[];\r\n language?: string;\r\n}\r\n\r\nexport interface TypesenseSearchOptions {\r\n translation?: string;\r\n book?: string;\r\n chapter?: string | number;\r\n language?: string;\r\n search?: string;\r\n}\r\n\r\n/**\r\n * Copied from https://github.com/wooorm/iso-639-3/blob/3b13f85fc82183a39b45d856fcd27660b026e507/iso6393-to-1.js\r\n *\r\n * (The MIT License)\r\n *\r\n * Copyright (c) 2014 Titus Wormer <tituswormer@gmail.com>\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining\r\n * a copy of this software and associated documentation files (the\r\n * 'Software'), to deal in the Software without restriction, including\r\n * without limitation the rights to use, copy, modify, merge, publish,\r\n * distribute, sublicense, and/or sell copies of the Software, and to\r\n * permit persons to whom the Software is furnished to do so, subject to\r\n * the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be\r\n * included in all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\r\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n */\r\nconst ISO_639_3_TO_1_LOCALE: Record<string, string> = {\r\n aar: 'aa',\r\n abk: 'ab',\r\n afr: 'af',\r\n aka: 'ak',\r\n amh: 'am',\r\n ara: 'ar',\r\n arg: 'an',\r\n asm: 'as',\r\n ava: 'av',\r\n ave: 'ae',\r\n aym: 'ay',\r\n aze: 'az',\r\n bak: 'ba',\r\n bam: 'bm',\r\n bel: 'be',\r\n ben: 'bn',\r\n bis: 'bi',\r\n bod: 'bo',\r\n bos: 'bs',\r\n bre: 'br',\r\n bul: 'bg',\r\n cat: 'ca',\r\n ces: 'cs',\r\n cha: 'ch',\r\n che: 'ce',\r\n chu: 'cu',\r\n chv: 'cv',\r\n cor: 'kw',\r\n cos: 'co',\r\n cre: 'cr',\r\n cym: 'cy',\r\n dan: 'da',\r\n deu: 'de',\r\n div: 'dv',\r\n dzo: 'dz',\r\n ell: 'el',\r\n eng: 'en',\r\n epo: 'eo',\r\n est: 'et',\r\n eus: 'eu',\r\n ewe: 'ee',\r\n fao: 'fo',\r\n fas: 'fa',\r\n fij: 'fj',\r\n fin: 'fi',\r\n fra: 'fr',\r\n fry: 'fy',\r\n ful: 'ff',\r\n gla: 'gd',\r\n gle: 'ga',\r\n glg: 'gl',\r\n glv: 'gv',\r\n grn: 'gn',\r\n guj: 'gu',\r\n hat: 'ht',\r\n hau: 'ha',\r\n hbs: 'sh',\r\n heb: 'he',\r\n her: 'hz',\r\n hin: 'hi',\r\n hmo: 'ho',\r\n hrv: 'hr',\r\n hun: 'hu',\r\n hye: 'hy',\r\n ibo: 'ig',\r\n ido: 'io',\r\n iii: 'ii',\r\n iku: 'iu',\r\n ile: 'ie',\r\n ina: 'ia',\r\n ind: 'id',\r\n ipk: 'ik',\r\n isl: 'is',\r\n ita: 'it',\r\n jav: 'jv',\r\n jpn: 'ja',\r\n kal: 'kl',\r\n kan: 'kn',\r\n kas: 'ks',\r\n kat: 'ka',\r\n kau: 'kr',\r\n kaz: 'kk',\r\n khm: 'km',\r\n kik: 'ki',\r\n kin: 'rw',\r\n kir: 'ky',\r\n kom: 'kv',\r\n kon: 'kg',\r\n kor: 'ko',\r\n kua: 'kj',\r\n kur: 'ku',\r\n lao: 'lo',\r\n lat: 'la',\r\n lav: 'lv',\r\n lim: 'li',\r\n lin: 'ln',\r\n lit: 'lt',\r\n ltz: 'lb',\r\n lub: 'lu',\r\n lug: 'lg',\r\n mah: 'mh',\r\n mal: 'ml',\r\n mar: 'mr',\r\n mkd: 'mk',\r\n mlg: 'mg',\r\n mlt: 'mt',\r\n mon: 'mn',\r\n mri: 'mi',\r\n msa: 'ms',\r\n mya: 'my',\r\n nau: 'na',\r\n nav: 'nv',\r\n nbl: 'nr',\r\n nde: 'nd',\r\n ndo: 'ng',\r\n nep: 'ne',\r\n nld: 'nl',\r\n nno: 'nn',\r\n nob: 'nb',\r\n nor: 'no',\r\n nya: 'ny',\r\n oci: 'oc',\r\n oji: 'oj',\r\n ori: 'or',\r\n orm: 'om',\r\n oss: 'os',\r\n pan: 'pa',\r\n pli: 'pi',\r\n pol: 'pl',\r\n por: 'pt',\r\n pus: 'ps',\r\n que: 'qu',\r\n roh: 'rm',\r\n ron: 'ro',\r\n run: 'rn',\r\n rus: 'ru',\r\n sag: 'sg',\r\n san: 'sa',\r\n sin: 'si',\r\n slk: 'sk',\r\n slv: 'sl',\r\n sme: 'se',\r\n smo: 'sm',\r\n sna: 'sn',\r\n snd: 'sd',\r\n som: 'so',\r\n sot: 'st',\r\n spa: 'es',\r\n sqi: 'sq',\r\n srd: 'sc',\r\n srp: 'sr',\r\n ssw: 'ss',\r\n sun: 'su',\r\n swa: 'sw',\r\n swe: 'sv',\r\n tah: 'ty',\r\n tam: 'ta',\r\n tat: 'tt',\r\n tel: 'te',\r\n tgk: 'tg',\r\n tgl: 'tl',\r\n tha: 'th',\r\n tir: 'ti',\r\n ton: 'to',\r\n tsn: 'tn',\r\n tso: 'ts',\r\n tuk: 'tk',\r\n tur: 'tr',\r\n twi: 'tw',\r\n uig: 'ug',\r\n ukr: 'uk',\r\n urd: 'ur',\r\n uzb: 'uz',\r\n ven: 've',\r\n vie: 'vi',\r\n vol: 'vo',\r\n wln: 'wa',\r\n wol: 'wo',\r\n xho: 'xh',\r\n yid: 'yi',\r\n yor: 'yo',\r\n zha: 'za',\r\n zho: 'zh',\r\n zul: 'zu',\r\n};\r\n\r\nexport async function uploadTypesenseVerses(\r\n nodes: string[],\r\n apiKey: string,\r\n db: PrismaClient,\r\n options: UploadTypesenseVersesOptions\r\n): Promise<void> {\r\n const logger = log.getLogger();\r\n\r\n const parsedNodes = nodes.map((node) => {\r\n const url = new URL(node);\r\n const protocol = url.protocol.replace(':', '');\r\n const host = url.hostname;\r\n const port = url.port\r\n ? parseInt(url.port, 10)\r\n : protocol === 'https'\r\n ? 443\r\n : 80;\r\n return { host, port, protocol };\r\n });\r\n\r\n const client = new Typesense.Client({\r\n nodes: parsedNodes,\r\n apiKey,\r\n connectionTimeoutSeconds: 10,\r\n });\r\n\r\n let translationWhere: Prisma.TranslationWhereInput | undefined =\r\n options.translations && options.translations.length > 0\r\n ? { id: { in: options.translations } }\r\n : undefined;\r\n\r\n if (options.language) {\r\n if (!translationWhere) {\r\n translationWhere = {};\r\n }\r\n translationWhere.language = options.language;\r\n }\r\n\r\n const translations = await db.translation.findMany({\r\n where: translationWhere,\r\n select: { id: true, language: true },\r\n });\r\n\r\n const translationsByLanguage = groupBy(translations, (t) => t.language);\r\n\r\n logger.log(`Uploading verses for ${translations.length} translation(s)...`);\r\n logger.log(\r\n `Grouped into ${Object.keys(translationsByLanguage).length} language collection(s).`\r\n );\r\n\r\n const BATCH_SIZE = 1000;\r\n\r\n for (const [languageCode, languageTranslations] of Object.entries(\r\n translationsByLanguage\r\n )) {\r\n const locale = ISO_639_3_TO_1_LOCALE[languageCode] ?? null;\r\n\r\n if (!locale) {\r\n logger.warn(\r\n `No ISO-639-1 locale mapping found for language code '${languageCode}'. Skipping.`\r\n );\r\n continue;\r\n }\r\n\r\n const collectionName = `bibleVerses.${languageCode}`;\r\n const schema = {\r\n name: collectionName,\r\n fields: [\r\n { name: 'translation', type: 'string' as const },\r\n { name: 'reference', type: 'string' as const },\r\n { name: 'referenceNormalized', type: 'string' as const },\r\n { name: 'book', type: 'string' as const },\r\n { name: 'chapter', type: 'int32' as const },\r\n { name: 'verse', type: 'int32' as const },\r\n { name: 'language', type: 'string' as const },\r\n {\r\n name: 'text',\r\n type: 'string' as const,\r\n stem: true,\r\n locale,\r\n },\r\n ],\r\n token_separators: [':'],\r\n };\r\n\r\n try {\r\n const existing = await client\r\n .collections(collectionName)\r\n .retrieve();\r\n logger.log(`Collection '${collectionName}' already exists.`);\r\n\r\n const existingFields = existing.fields.map((f) => f.name);\r\n const requiredFields = schema.fields.map((f) => f.name);\r\n const missingFields = requiredFields.filter(\r\n (f) => !existingFields.includes(f)\r\n );\r\n\r\n if (missingFields.length > 0) {\r\n logger.log(\r\n `Collection '${collectionName}' is missing fields: ${missingFields.join(', ')}. Updating schema...`\r\n );\r\n await client.collections(collectionName).update(schema);\r\n }\r\n } catch {\r\n logger.log(\r\n `Creating collection '${collectionName}' with locale '${locale}'...`\r\n );\r\n await client.collections().create(schema);\r\n logger.log(`Collection '${collectionName}' created.`);\r\n }\r\n\r\n for (const translation of languageTranslations) {\r\n logger.log(\r\n `Processing translation: ${translation.id} -> ${collectionName}`\r\n );\r\n let skip = 0;\r\n\r\n while (true) {\r\n const verses = await db.chapterVerse.findMany({\r\n where: { translationId: translation.id },\r\n select: {\r\n translationId: true,\r\n bookId: true,\r\n chapterNumber: true,\r\n number: true,\r\n text: true,\r\n },\r\n orderBy: [\r\n { bookId: 'asc' },\r\n { chapterNumber: 'asc' },\r\n { number: 'asc' },\r\n ],\r\n skip,\r\n take: BATCH_SIZE,\r\n });\r\n\r\n if (verses.length === 0) {\r\n break;\r\n }\r\n\r\n let documents = [] as any[];\r\n let books = new Map<string, Book | null>();\r\n\r\n for (const verse of verses) {\r\n let book = books.get(verse.bookId) ?? null;\r\n if (!book) {\r\n book = await db.book.findFirst({\r\n where: {\r\n translationId: translation.id,\r\n id: verse.bookId,\r\n },\r\n });\r\n if (book) {\r\n books.set(verse.bookId, book);\r\n } else {\r\n logger.warn(\r\n `Book not found for translation ${verse.translationId} and book ID ${verse.bookId}`\r\n );\r\n }\r\n }\r\n\r\n let normalizedReference = `${verse.bookId} ${verse.chapterNumber}:${verse.number}`;\r\n\r\n documents.push({\r\n id: `${verse.translationId}_${verse.bookId}_${verse.chapterNumber}_${verse.number}`,\r\n translation: verse.translationId,\r\n reference: `${book ? book.commonName : verse.bookId} ${verse.chapterNumber}:${verse.number}`,\r\n referenceNormalized: normalizedReference,\r\n book: verse.bookId,\r\n chapter: verse.chapterNumber,\r\n verse: verse.number,\r\n language: translation.language,\r\n text: verse.text,\r\n });\r\n }\r\n\r\n await client\r\n .collections(collectionName)\r\n .documents()\r\n .import(documents, { action: 'upsert' });\r\n\r\n logger.log(\r\n ` Uploaded ${skip + verses.length} verses for ${translation.id}`\r\n );\r\n\r\n if (verses.length < BATCH_SIZE) {\r\n break;\r\n }\r\n skip += BATCH_SIZE;\r\n }\r\n }\r\n }\r\n\r\n logger.log('Done uploading verses to Typesense language collections.');\r\n}\r\n\r\nexport async function searchTypesenseVerses(\r\n nodes: string[],\r\n apiKey: string,\r\n options: TypesenseSearchOptions\r\n) {\r\n const parsedNodes = nodes.map((node) => {\r\n const url = new URL(node);\r\n const protocol = url.protocol.replace(':', '');\r\n const host = url.hostname;\r\n const port = url.port\r\n ? parseInt(url.port, 10)\r\n : protocol === 'https'\r\n ? 443\r\n : 80;\r\n return { host, port, protocol };\r\n });\r\n\r\n const client = new Typesense.Client({\r\n nodes: parsedNodes,\r\n apiKey,\r\n connectionTimeoutSeconds: 10,\r\n });\r\n\r\n const filterByParts = [] as string[];\r\n if (options.translation) {\r\n filterByParts.push(`translation:=${options.translation}`);\r\n }\r\n if (options.book) {\r\n filterByParts.push(`book:=${options.book}`);\r\n }\r\n if (options.chapter !== undefined && options.chapter !== null) {\r\n const chapter = Number.parseInt(String(options.chapter), 10);\r\n if (!Number.isNaN(chapter)) {\r\n filterByParts.push(`chapter:=${chapter}`);\r\n }\r\n }\r\n if (options.language) {\r\n filterByParts.push(`language:=${options.language}`);\r\n }\r\n\r\n const collectionName = `bibleVerses.${options.language || 'en'}`;\r\n\r\n return await client\r\n .collections(collectionName)\r\n .documents()\r\n .search({\r\n q: options.search?.trim() ? options.search : '*',\r\n query_by: ['referenceNormalized', 'reference', 'text'],\r\n filter_by:\r\n filterByParts.length > 0\r\n ? filterByParts.join(' && ')\r\n : undefined,\r\n per_page: 50,\r\n });\r\n}\r\n\r\nexport async function askForMetadata(\r\n defaultId?: string\r\n): Promise<InputTranslationMetadata> {\r\n const id = await input({\r\n message: 'Enter the translation ID',\r\n default: defaultId,\r\n });\r\n const language = await input({\r\n message: 'Enter the ISO 639 translation language',\r\n validate: (input: string) => {\r\n return isValid(input) ? true : 'Invalid language code.';\r\n },\r\n required: true,\r\n });\r\n const direction = await select({\r\n message: 'Enter the text direction of the language',\r\n choices: [\r\n { name: 'Left-to-right', value: 'ltr' },\r\n { name: 'Right-to-left', value: 'rtl' },\r\n ],\r\n default: 'ltr',\r\n });\r\n const shortName = await input({\r\n message: 'Enter the short name of the translation',\r\n default: id,\r\n required: false,\r\n });\r\n const name = await input({\r\n message: 'Enter the name of the translation',\r\n required: true,\r\n });\r\n const englishName = await input({\r\n message: 'Enter the English name of the translation',\r\n default: name,\r\n });\r\n const licenseUrl = await input({\r\n message: 'Enter the license URL for the translation',\r\n required: true,\r\n });\r\n const website = await input({\r\n message: 'Enter the website URL for the translation',\r\n required: true,\r\n default: licenseUrl,\r\n });\r\n\r\n return {\r\n id,\r\n language,\r\n direction: direction as InputTranslationMetadata['direction'],\r\n shortName,\r\n name,\r\n englishName,\r\n licenseUrl,\r\n website,\r\n };\r\n}\r\n\r\nexport interface CopyOpenBibleAudioOptions {\r\n /**\r\n * The translation ID to copy (e.g. \"BSB\"). If omitted, all known translations are copied.\r\n */\r\n translation?: string;\r\n\r\n /**\r\n * The readers to copy (e.g. [\"hays\", \"souer\"]). If omitted, all known readers for the translation are copied.\r\n */\r\n readers?: string[];\r\n\r\n /**\r\n * Whether to overwrite existing files.\r\n */\r\n overwrite?: boolean;\r\n}\r\n\r\n/**\r\n * Copies .mp3 files from the OpenBible filename format to the Free Use Bible API format:\r\n * /api/{translationId}/{bookId}/{chapterNumber}/audio/{reader}.mp3\r\n * @param srcDir The source directory containing .mp3 files in OpenBible filename format.\r\n * @param destDir The destination directory for files in API format.\r\n * @param options The options.\r\n */\r\nexport async function copyOpenBibleAudio(\r\n srcDir: string,\r\n destDir: string,\r\n options: CopyOpenBibleAudioOptions = {}\r\n): Promise<void> {\r\n const logger = log.getLogger();\r\n\r\n // let folder = `${translation}_${bookOrder}_Chapters_${reader}`;\r\n\r\n const folders = new Map<string, Map<string, string>>([\r\n [\r\n 'BSB',\r\n new Map([\r\n ['hays', 'BSB_Chapters_Hays'],\r\n ['souer', 'BSB_Chapters_Souer'],\r\n ['david', 'BSB_Chapters_David'],\r\n ]),\r\n ],\r\n ]);\r\n\r\n const translationsToProcess: Array<[string, string]> = options.translation\r\n ? (options.readers?.length\r\n ? options.readers\r\n : Array.from(\r\n KNOWN_AUDIO_FILE_TRANSLATIONS.get(\r\n options.translation\r\n )?.keys() ?? []\r\n )\r\n ).map((reader) => [options.translation!, reader])\r\n : Array.from(KNOWN_AUDIO_FILE_TRANSLATIONS.entries()).flatMap(\r\n ([translationId, readers]) =>\r\n Array.from(readers.keys()).map((reader): [string, string] => [\r\n translationId,\r\n reader,\r\n ])\r\n );\r\n\r\n type CopyTask = {\r\n translationId: string;\r\n reader: string;\r\n bookId: string;\r\n chapter: number;\r\n filename: string;\r\n srcPath: string;\r\n destPath: string;\r\n };\r\n\r\n const tasks: CopyTask[] = [];\r\n\r\n for (const [translationId, reader] of translationsToProcess) {\r\n const generator =\r\n KNOWN_AUDIO_FILE_TRANSLATIONS.get(translationId)?.get(reader);\r\n\r\n if (!generator) {\r\n logger.warn(\r\n 'Unknown translation/reader:',\r\n `${translationId}/${reader}`\r\n );\r\n continue;\r\n }\r\n\r\n const folder = folders.get(translationId)?.get(reader);\r\n if (!folder) {\r\n logger.warn(\r\n 'No folder mapping found for translation/reader:',\r\n `${translationId}/${reader}`\r\n );\r\n continue;\r\n }\r\n\r\n for (const [bookId, chapters] of bookChapterCountMap) {\r\n for (let chapter = 1; chapter <= chapters; chapter++) {\r\n const filename = generator(bookId, chapter);\r\n tasks.push({\r\n translationId,\r\n reader,\r\n bookId,\r\n chapter,\r\n filename,\r\n srcPath: path.resolve(srcDir, folder, filename),\r\n destPath: path.resolve(\r\n destDir,\r\n 'api',\r\n translationId,\r\n bookId,\r\n chapter.toString(),\r\n 'audio',\r\n `${reader}.mp3`\r\n ),\r\n });\r\n }\r\n }\r\n }\r\n\r\n for (const task of tasks) {\r\n const { filename, srcPath, destPath } = task;\r\n if (!(await exists(srcPath))) {\r\n logger.warn('Source file not found:', srcPath);\r\n continue;\r\n }\r\n\r\n if (!options.overwrite && (await exists(destPath))) {\r\n continue;\r\n }\r\n\r\n await mkdir(path.dirname(destPath), { recursive: true });\r\n await copyFile(srcPath, destPath);\r\n logger.log(\r\n `Copied: ${filename} -> ${path.relative(destDir, destPath)}`\r\n );\r\n }\r\n}\r\n", "import { mkdir, readdir } from 'node:fs/promises';\nimport { existsSync } from 'fs';\nimport { execFile as execFileCallback } from 'child_process';\nimport { promisify } from 'util';\nimport { confirm, input } from '@inquirer/prompts';\nimport { log } from '@helloao/tools';\n\nconst execFile = promisify(execFileCallback);\n\n/**\n * Finds BibleMultiConverter.jar automatically in common locations\n */\nexport async function findBibleMultiConverterJar(\n providedPath?: string\n): Promise<string | null> {\n const logger = log.getLogger();\n //Use provided path\n if (providedPath && existsSync(providedPath)) {\n return providedPath;\n }\n\n // Check common locations for standalone JAR file\n const commonPaths = [\n './BibleMultiConverter.jar',\n './tools/BibleMultiConverter.jar',\n '../BibleMultiConverter.jar',\n '../../BibleMultiConverter.jar',\n 'BibleMultiConverter.jar',\n ];\n\n // Check common locations for JAR file inside BibleMultiConverter folder\n const folderPaths = [\n './BibleMultiConverter/BibleMultiConverter.jar',\n './tools/BibleMultiConverter/BibleMultiConverter.jar',\n '../BibleMultiConverter/BibleMultiConverter.jar',\n '../../BibleMultiConverter/BibleMultiConverter.jar',\n ];\n\n // Combine all paths to check\n const allPaths = [...commonPaths, ...folderPaths];\n\n for (const jarPath of allPaths) {\n if (existsSync(jarPath)) {\n logger.log(`Found BibleMultiConverter.jar at: ${jarPath}`);\n return jarPath;\n }\n }\n\n return null;\n}\n\n/**\n * Prompts user for BibleMultiConverter.jar location\n */\nexport async function promptForBibleMultiConverter(): Promise<string | null> {\n const logger = log.getLogger();\n logger.log('BibleMultiConverter.jar not found in common locations.');\n\n const hasConverter = await confirm({\n message: 'Do you have BibleMultiConverter.jar available?',\n });\n\n if (!hasConverter) {\n logger.log(\n 'Please download BibleMultiConverter.jar from: https://github.com/schierlm/BibleMultiConverter/releases'\n );\n return null;\n }\n\n const jarPath = await input({\n message: 'Enter the full path to BibleMultiConverter.jar:',\n validate: (input: string) => {\n if (!existsSync(input)) {\n return 'File not found. Please enter a valid path.';\n }\n if (!input.endsWith('.jar')) {\n return 'Please provide a .jar file.';\n }\n return true;\n },\n });\n\n return jarPath;\n}\n\n/**\n * Converts USFM directory to USX3 using BibleMultiConverter\n */\nexport async function convertUsfmToUsx3(\n inputDir: string,\n outputDir: string,\n jarPath: string\n): Promise<boolean> {\n const logger = log.getLogger();\n try {\n logger.log(`Converting USFM files from ${inputDir} to USX3 format...`);\n\n // Handle overwrite logic for output directory\n // if (overwrite && existsSync(outputDir)) {\n // logger.log(`Overwriting existing USX3 directory: ${outputDir}`);\n // const { rm } = await import('node:fs/promises');\n // await rm(outputDir, { recursive: true, force: true });\n // }\n\n await mkdir(outputDir, { recursive: true });\n\n // Run BibleMultiConverter\n const args = [\n '-jar',\n jarPath,\n 'ParatextConverter',\n 'USFM',\n inputDir,\n 'USX3',\n outputDir,\n '*.usx',\n ];\n\n logger.log(`Running: java ${args.join(' ')}`);\n\n const { stdout, stderr } = await execFile('java', args);\n\n if (stdout) logger.log('Conversion output:', stdout);\n if (stderr) logger.log('Conversion warnings:', stderr);\n\n // Verify conversion worked\n const files = await readdir(outputDir);\n const usxFiles = files.filter((f) => f.endsWith('.usx'));\n\n if (usxFiles.length > 0) {\n logger.log(\n `Successfully converted to ${usxFiles.length} USX3 files`\n );\n return true;\n } else {\n logger.log('No USX3 files were created');\n return false;\n }\n } catch (error: any) {\n logger.error('Conversion failed:', error.message);\n return false;\n }\n}\n", "import papaparse from 'papaparse';\r\nconst { parse } = papaparse;\r\nimport { EBibleSource } from './prisma-gen/client.js';\r\nimport { DateTime } from 'luxon';\r\nimport hash from 'hash.js';\r\nconst { sha256 } = hash;\r\nimport { getTranslationId } from '@helloao/tools/utils.js';\r\n\r\n/**\r\n * Fetches eBible translation metadata and returns EBibleSource objects.\r\n */\r\nexport async function fetchEBibleMetadata(): Promise<EBibleSource[]> {\r\n const translationsResponse = await fetch(\r\n 'https://ebible.org/Scriptures/translations.csv'\r\n );\r\n const translationsCsv = await translationsResponse.text();\r\n const ebibleTranslations = parse<{\r\n languageCode: string;\r\n translationId: string;\r\n languageName: string;\r\n languageNameInEnglish: string;\r\n dialect: string;\r\n homeDomain: string;\r\n title: string;\r\n description: string;\r\n Redistributable: string;\r\n Copyright: string;\r\n UpdateDate: string;\r\n publicationURL: string;\r\n OTbooks: string;\r\n OTchapters: string;\r\n OTverses: string;\r\n NTbooks: string;\r\n NTchapters: string;\r\n NTverses: string;\r\n DCbooks: string;\r\n DCchapters: string;\r\n DCverses: string;\r\n FCBHID: string;\r\n Certified: string;\r\n inScript: string;\r\n swordName: string;\r\n rodCode: string;\r\n textDirection: string;\r\n downloadable: string;\r\n font: string;\r\n shortTitle: string;\r\n PODISBN: string;\r\n script: string;\r\n sourceDate: string;\r\n }>(translationsCsv.trimEnd(), {\r\n header: true,\r\n });\r\n\r\n return ebibleTranslations.data.map((translation) => {\r\n const fcbhid = translation.FCBHID.trim();\r\n const languageCode = translation.languageCode.trim();\r\n\r\n const source: EBibleSource = {\r\n id: translation.translationId,\r\n translationId: getTranslationId(\r\n `${languageCode.toLowerCase()}_${fcbhid.slice(3).toLowerCase()}`\r\n ),\r\n title: translation.title.trim(),\r\n shortTitle: translation.shortTitle.trim(),\r\n textDirection: translation.textDirection.trim(),\r\n languageCode: languageCode,\r\n copyright: translation.Copyright.trim(),\r\n description: translation.description.trim(),\r\n oldTestamentBooks: parseInt(translation.OTbooks.trim()),\r\n oldTestamentChapters: parseInt(translation.OTchapters.trim()),\r\n oldTestamentVerses: parseInt(translation.OTverses.trim()),\r\n newTestamentBooks: parseInt(translation.NTbooks.trim()),\r\n newTestamentChapters: parseInt(translation.NTchapters.trim()),\r\n newTestamentVerses: parseInt(translation.NTverses.trim()),\r\n apocryphaBooks: parseInt(translation.DCbooks.trim()),\r\n apocryphaChapters: parseInt(translation.DCchapters.trim()),\r\n apocryphaVerses: parseInt(translation.DCverses.trim()),\r\n redistributable:\r\n translation.Redistributable.trim().toUpperCase() === 'TRUE'\r\n ? 'TRUE'\r\n : ('FALSE' as any),\r\n FCBHID: fcbhid,\r\n sourceDate: DateTime.fromISO(\r\n translation.sourceDate.trim()\r\n ).toISO() as any,\r\n updateDate: DateTime.fromISO(\r\n translation.UpdateDate.trim()\r\n ).toISO() as any,\r\n usfmDownloadDate: null,\r\n usfmDownloadPath: null,\r\n usfmZipUrl: null,\r\n usfmZipEtag: null,\r\n sha256: null,\r\n };\r\n\r\n source.sha256 = sha256()\r\n .update(source.id)\r\n .update(source.translationId)\r\n .update(source.title)\r\n .update(source.shortTitle)\r\n .update(source.languageCode)\r\n .update(source.textDirection)\r\n .update(source.copyright)\r\n .update(source.description)\r\n .update(source.oldTestamentBooks)\r\n .update(source.oldTestamentChapters)\r\n .update(source.oldTestamentVerses)\r\n .update(source.newTestamentBooks)\r\n .update(source.newTestamentChapters)\r\n .update(source.newTestamentVerses)\r\n .update(source.apocryphaBooks)\r\n .update(source.apocryphaChapters)\r\n .update(source.apocryphaVerses)\r\n .update(source.redistributable)\r\n .update(source.sourceDate)\r\n .update(source.updateDate)\r\n .digest('hex');\r\n\r\n return source;\r\n });\r\n}\r\n"],
|
|
5
|
+
"mappings": "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AA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AA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",
|
|
6
|
+
"names": ["path", "extname", "mkdir", "writeFile", "DOMParser", "Element", "Node", "path", "reader", "path", "runtime", "NullTypes", "path", "Sql", "fsExtra", "writeFile", "path", "fsExtra", "Readable", "log", "batch", "serializedFiles", "files", "translation", "commentary", "log", "dataset", "book", "translation", "metadataJson", "path", "hash", "writeFile", "reader", "Readable", "hash", "log", "exists", "readdir", "readFile", "fsExtra", "sha256", "dirname", "path", "batch", "path", "files", "log", "translations", "translation", "book", "chapter", "c", "reader", "verses", "sha256", "hash", "commentaries", "commentary", "datasets", "dataset", "Sql", "readdir", "readFile", "words", "log", "log", "resolve", "path", "hash", "extname", "Readable", "log", "ApiAvailableCommentariesSchema", "ApiCommentaryBookChapterSchema", "ApiCommentaryBooksSchema", "log", "extname", "batch", "Readable", "path", "basename", "extname", "Sql", "mkdir", "readdir", "writeFile", "fsExtra", "generateDataset", "input", "confirm", "log", "DateTime", "ZipReader", "existsSync", "mkdir", "readdir", "existsSync", "input", "log", "hash", "parse", "sha256", "translation", "exists", "readFile", "fsExtra", "dirname", "path", "log", "metaDir", "writeFile", "Sql", "importTranslations", "readdir", "importCommentaries", "translation", "reader", "chapter", "extname", "translationId", "input", "dataset", "generateDataset", "choices", "existsSync", "mkdir", "ZipReader", "DateTime", "hash", "confirm", "basename", "book", "confirm", "input", "log", "path", "resolve", "DOMParser", "Element", "Node", "log", "confirm", "input", "extname", "mkdir", "writeFile", "importTranslations", "importCommentaries"]
|
|
7
|
+
}
|