@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 22.4 kB
Source Map (JSON)
{"version":3,"file":"document-versions.mjs","names":["queryBuilder","constants"],"sources":["../../../src/libs/repositories/document-versions.ts"],"sourcesContent":["import { sql } from \"kysely\";\nimport z from \"zod\";\nimport constants from \"../../constants/constants.js\";\nimport { versionTypesSchema } from \"../../schemas/document-versions.js\";\nimport type { GetMultipleRevisionsQueryParams } from \"../../schemas/documents.js\";\nimport type { BrickTypes } from \"../collection/builders/brick-builder/types.js\";\nimport type {\n\tCollectionSchemaColumn,\n\tCollectionSchemaTable,\n} from \"../collection/schema/types.js\";\nimport type DatabaseAdapter from \"../db/adapter-base.js\";\nimport queryBuilder from \"../db/query-builder/index.js\";\nimport type {\n\tDocumentVersionType,\n\tKyselyDB,\n\tLucidBrickTableName,\n\tLucidDocumentTableName,\n\tLucidVersionTable,\n\tLucidVersionTableName,\n\tSelect,\n} from \"../db/types.js\";\nimport type { BrickQueryResponse } from \"./document-bricks.js\";\nimport DynamicRepository from \"./parents/dynamic-repository.js\";\nimport type { DynamicConfig, QueryProps } from \"./types.js\";\n\nexport interface RevisionsQueryResponse extends Select<LucidVersionTable> {\n\t// documents\n\tdocument_created_by?: number | null;\n\tdocument_created_at?: Date | string | null;\n\tdocument_updated_by?: number | null;\n\tdocument_updated_at?: Date | string | null;\n\t// brick count\n\t[key: LucidBrickTableName]: Array<{\n\t\tid: number;\n\t\tlocale: string;\n\t\tbrick_instance_id: string;\n\t\tbrick_type: BrickTypes;\n\t}>;\n}\n\nexport default class DocumentVersionsRepository extends DynamicRepository<LucidVersionTableName> {\n\tconstructor(db: KyselyDB, dbAdapter: DatabaseAdapter) {\n\t\tsuper(db, dbAdapter, \"lucid_document__collection-key__ver\");\n\t}\n\tprivate readonly documentFieldsUnionAlias = \"document_fields\";\n\ttableSchema = z.object({\n\t\tid: z.number(),\n\t\tcollection_key: z.string(),\n\t\tcollection_migration_id: z.number(),\n\t\tdocument_id: z.number(),\n\t\ttype: versionTypesSchema,\n\t\tpromoted_from: z.number().nullable(),\n\t\tcontent_id: z.string(),\n\t\tcreated_by: z.number(),\n\t\tupdated_by: z.number(),\n\t\tupdated_at: z.union([z.string(), z.date()]).nullable(),\n\t\tcreated_at: z.union([z.string(), z.date()]).nullable(),\n\t});\n\tcolumnFormats = {\n\t\tid: this.dbAdapter.getDataType(\"primary\"),\n\t\tcollection_key: this.dbAdapter.getDataType(\"text\"),\n\t\tcollection_migration_id: this.dbAdapter.getDataType(\"integer\"),\n\t\tdocument_id: this.dbAdapter.getDataType(\"integer\"),\n\t\ttype: this.dbAdapter.getDataType(\"text\"),\n\t\tpromoted_from: this.dbAdapter.getDataType(\"integer\"),\n\t\tcontent_id: this.dbAdapter.getDataType(\"text\"),\n\t\tcreated_by: this.dbAdapter.getDataType(\"integer\"),\n\t\tupdated_by: this.dbAdapter.getDataType(\"integer\"),\n\t\tupdated_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t\tcreated_at: this.dbAdapter.getDataType(\"timestamp\"),\n\t};\n\tqueryConfig = undefined;\n\n\t/**\n\t * Takes a group of document IDs and their tables, document-field table schema and fetches all document-field rows for that version\n\t */\n\tasync selectMultipleUnion<V extends boolean = false>(\n\t\tprops: QueryProps<\n\t\t\tV,\n\t\t\t{\n\t\t\t\tunions: Array<{\n\t\t\t\t\tcollectionKey: string;\n\t\t\t\t\ttables: {\n\t\t\t\t\t\tdocument: LucidDocumentTableName;\n\t\t\t\t\t\tversion: LucidVersionTableName;\n\t\t\t\t\t\tdocumentFields: LucidBrickTableName;\n\t\t\t\t\t};\n\t\t\t\t\tdocumentFieldSchema: CollectionSchemaTable<LucidBrickTableName>;\n\t\t\t\t\tids: number[];\n\t\t\t\t\tversionType?: Exclude<DocumentVersionType, \"revision\">;\n\t\t\t\t}>;\n\t\t\t\t/** The status used to determine which version of the relation custom field refs to fetch */\n\t\t\t\tversionType: Exclude<DocumentVersionType, \"revision\">;\n\t\t\t\ttenantKey?: string | null;\n\t\t\t}\n\t\t>,\n\t) {\n\t\tif (props.unions.length === 0) {\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: [],\n\t\t\t};\n\t\t}\n\n\t\tconst unionQueries = props.unions.map(\n\t\t\t({ tables, ids, documentFieldSchema, versionType }) => {\n\t\t\t\tconst { table, ref } = this.db.dynamic;\n\t\t\t\tconst targetVersionType = versionType ?? props.versionType;\n\n\t\t\t\tlet query = this.db\n\t\t\t\t\t.selectFrom(tables.version)\n\t\t\t\t\t.innerJoin(tables.document, (join) =>\n\t\t\t\t\t\tjoin.onRef(\n\t\t\t\t\t\t\t`${tables.document}.id`,\n\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\t`${tables.version}.document_id`,\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t.select([\n\t\t\t\t\t\t`${tables.version}.id`,\n\t\t\t\t\t\t`${tables.version}.collection_key`,\n\t\t\t\t\t\t`${tables.version}.document_id`,\n\t\t\t\t\t\t`${tables.version}.type`,\n\t\t\t\t\t\t`${tables.version}.created_by`,\n\t\t\t\t\t\t`${tables.version}.updated_by`,\n\t\t\t\t\t\t`${tables.version}.created_at`,\n\t\t\t\t\t\t`${tables.version}.updated_at`,\n\t\t\t\t\t])\n\t\t\t\t\t.select(() => [\n\t\t\t\t\t\tthis.dbAdapter\n\t\t\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\t\t\tthis.db\n\t\t\t\t\t\t\t\t\t.selectFrom(table(tables.documentFields).as(\"df\"))\n\t\t\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\t\tref(\"df.document_id\"),\n\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\t`${tables.version}.document_id`,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\t\tref(\"df.document_version_id\"),\n\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\t`${tables.version}.id`,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.select(\n\t\t\t\t\t\t\t\t\t\tdocumentFieldSchema.columns.map((column) =>\n\t\t\t\t\t\t\t\t\t\t\tref(`df.${column.name}`),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.as(this.documentFieldsUnionAlias),\n\t\t\t\t\t])\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t.where(`${tables.version}.type`, \"=\", targetVersionType)\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t.where(`${tables.version}.document_id`, \"in\", ids)\n\t\t\t\t\t.where(\n\t\t\t\t\t\t`${tables.document}.is_deleted`,\n\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\tthis.dbAdapter.getDefault(\"boolean\", \"false\"),\n\t\t\t\t\t);\n\n\t\t\t\tquery = queryBuilder.tenantScope(query, {\n\t\t\t\t\ttenantKey: props.tenantKey,\n\t\t\t\t\tcolumn: `${tables.document}.tenant_key`,\n\t\t\t\t});\n\n\t\t\t\treturn query;\n\t\t\t},\n\t\t);\n\n\t\tlet query = unionQueries[0];\n\n\t\tif (query === undefined) {\n\t\t\treturn {\n\t\t\t\terror: undefined,\n\t\t\t\tdata: [],\n\t\t\t};\n\t\t}\n\n\t\tfor (let i = 1; i < unionQueries.length; i++) {\n\t\t\tconst iQuery = unionQueries[i];\n\t\t\tif (iQuery === undefined) continue;\n\t\t\tquery = query.unionAll(iQuery);\n\t\t}\n\n\t\tconst exec = await this.executeQuery(\n\t\t\t() => query.execute() as unknown as Promise<BrickQueryResponse[]>,\n\t\t\t{\n\t\t\t\tmethod: \"selectMultipleByIdsUnion\",\n\t\t\t},\n\t\t);\n\t\tif (exec.response.error) return exec.response;\n\n\t\tif (exec.response.data) {\n\t\t\tconst unionByCollectionKey = new Map(\n\t\t\t\tprops.unions.map((union) => [union.collectionKey, union]),\n\t\t\t);\n\n\t\t\t// UNION results keep one column name for every branch, so select\n\t\t\t// document fields under a neutral alias and remap them per collection.\n\t\t\texec.response.data = exec.response.data.map((row) => {\n\t\t\t\tconst union = unionByCollectionKey.get(row.collection_key);\n\t\t\t\tconst targetFieldsTable = union?.tables.documentFields;\n\t\t\t\tif (!targetFieldsTable || row[targetFieldsTable] !== undefined) {\n\t\t\t\t\treturn row;\n\t\t\t\t}\n\n\t\t\t\tconst { [this.documentFieldsUnionAlias]: documentFields, ...rest } =\n\t\t\t\t\trow as BrickQueryResponse & Record<string, unknown>;\n\n\t\t\t\treturn {\n\t\t\t\t\t...rest,\n\t\t\t\t\t[targetFieldsTable]: documentFields,\n\t\t\t\t} as BrickQueryResponse;\n\t\t\t});\n\t\t}\n\n\t\treturn this.validateResponse(exec, {\n\t\t\t...props.validation,\n\t\t\tmode: \"multiple\",\n\t\t});\n\t}\n\t/**\n\t * Selects document history entries for a document ID and returns basic info\n\t * for each brick table for meta data. This includes normal revisions and\n\t * publish-operation snapshots that current environment versions were promoted\n\t * from, so the admin history timeline can attach environments to their source.\n\t */\n\tasync selectMultipleRevisions(\n\t\tprops: {\n\t\t\tdocumentId: number;\n\t\t\tquery: GetMultipleRevisionsQueryParams;\n\t\t\ttables: {\n\t\t\t\tdocument: LucidDocumentTableName;\n\t\t\t};\n\t\t\tbricksSchema: Array<{\n\t\t\t\tname: LucidBrickTableName;\n\t\t\t\tcolumns: Array<CollectionSchemaColumn>;\n\t\t\t}>;\n\t\t},\n\t\tdynamicConfig: DynamicConfig<LucidVersionTableName>,\n\t) {\n\t\tconst queryFn = async () => {\n\t\t\tconst { table, ref } = this.db.dynamic;\n\n\t\t\tlet query = this.db\n\t\t\t\t.selectFrom(dynamicConfig.tableName)\n\t\t\t\t.innerJoin(props.tables.document, (join) =>\n\t\t\t\t\tjoin.onRef(\n\t\t\t\t\t\t`${props.tables.document}.id`,\n\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t`${dynamicConfig.tableName}.document_id`,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t// @ts-expect-error\n\t\t\t\t.select([\n\t\t\t\t\t`${dynamicConfig.tableName}.id`,\n\t\t\t\t\t`${dynamicConfig.tableName}.type`,\n\t\t\t\t\t`${dynamicConfig.tableName}.promoted_from`,\n\t\t\t\t\t`${dynamicConfig.tableName}.created_at`,\n\t\t\t\t\t`${dynamicConfig.tableName}.created_by`,\n\t\t\t\t\t`${dynamicConfig.tableName}.document_id`,\n\t\t\t\t\t`${dynamicConfig.tableName}.collection_key`,\n\t\t\t\t\t`${dynamicConfig.tableName}.content_id`,\n\t\t\t\t\t`${props.tables.document}.created_by as document_created_by`,\n\t\t\t\t\t`${props.tables.document}.created_at as document_created_at`,\n\t\t\t\t\t`${props.tables.document}.updated_by as document_updated_by`,\n\t\t\t\t\t`${props.tables.document}.updated_at as document_updated_at`,\n\t\t\t\t])\n\t\t\t\t// @ts-expect-error\n\t\t\t\t.where(`${dynamicConfig.tableName}.document_id`, \"=\", props.documentId)\n\t\t\t\t.where(({ and, eb, exists, or }) =>\n\t\t\t\t\tor([\n\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\teb(`${dynamicConfig.tableName}.type`, \"=\", \"revision\"),\n\t\t\t\t\t\tand([\n\t\t\t\t\t\t\teb(\n\t\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\t\t`${dynamicConfig.tableName}.type`,\n\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\tconstants.collectionBuilder.publishing.snapshotVersionType,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\texists(\n\t\t\t\t\t\t\t\tthis.db\n\t\t\t\t\t\t\t\t\t.selectFrom(\n\t\t\t\t\t\t\t\t\t\ttable(dynamicConfig.tableName).as(\"environment_version\"),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.select(sql.lit(1).as(\"one\"))\n\t\t\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\t\t\"environment_version.promoted_from\",\n\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\t`${dynamicConfig.tableName}.id`,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\t\t\"environment_version.document_id\",\n\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\t`${dynamicConfig.tableName}.document_id`,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.where(\"environment_version.type\", \"not in\", [\n\t\t\t\t\t\t\t\t\t\t\"latest\",\n\t\t\t\t\t\t\t\t\t\t\"revision\",\n\t\t\t\t\t\t\t\t\t\tconstants.collectionBuilder.publishing.snapshotVersionType,\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]),\n\t\t\t\t\t]),\n\t\t\t\t);\n\n\t\t\tfor (const brick of props.bricksSchema) {\n\t\t\t\tquery = query.select(() =>\n\t\t\t\t\tthis.dbAdapter\n\t\t\t\t\t\t.jsonArrayFrom(\n\t\t\t\t\t\t\tthis.db\n\t\t\t\t\t\t\t\t.selectFrom(table(brick.name).as(\"b\"))\n\t\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\tref(\"b.document_version_id\"),\n\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t`${dynamicConfig.tableName}.id`,\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.select([\n\t\t\t\t\t\t\t\t\tref(\"b.id\"),\n\t\t\t\t\t\t\t\t\tref(\"b.locale\"),\n\t\t\t\t\t\t\t\t\tref(\"b.brick_instance_id\"),\n\t\t\t\t\t\t\t\t\tref(\"b.brick_type\"),\n\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.as(brick.name),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst queryCount = this.db\n\t\t\t\t.selectFrom(dynamicConfig.tableName)\n\t\t\t\t.innerJoin(props.tables.document, (join) =>\n\t\t\t\t\tjoin.onRef(\n\t\t\t\t\t\t`${props.tables.document}.id`,\n\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t`${dynamicConfig.tableName}.document_id`,\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.select(\n\t\t\t\t\tsql`count(distinct ${sql.ref(`${dynamicConfig.tableName}.id`)})`.as(\n\t\t\t\t\t\t\"count\",\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t// @ts-expect-error\n\t\t\t\t.where(`${dynamicConfig.tableName}.document_id`, \"=\", props.documentId)\n\t\t\t\t.where(({ and, eb, exists, or }) =>\n\t\t\t\t\tor([\n\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\teb(`${dynamicConfig.tableName}.type`, \"=\", \"revision\"),\n\t\t\t\t\t\tand([\n\t\t\t\t\t\t\teb(\n\t\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\t\t`${dynamicConfig.tableName}.type`,\n\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\tconstants.collectionBuilder.publishing.snapshotVersionType,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\texists(\n\t\t\t\t\t\t\t\tthis.db\n\t\t\t\t\t\t\t\t\t.selectFrom(\n\t\t\t\t\t\t\t\t\t\ttable(dynamicConfig.tableName).as(\"environment_version\"),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.select(sql.lit(1).as(\"one\"))\n\t\t\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\t\t\"environment_version.promoted_from\",\n\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\t`${dynamicConfig.tableName}.id`,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.whereRef(\n\t\t\t\t\t\t\t\t\t\t\"environment_version.document_id\",\n\t\t\t\t\t\t\t\t\t\t\"=\",\n\t\t\t\t\t\t\t\t\t\t`${dynamicConfig.tableName}.document_id`,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.where(\"environment_version.type\", \"not in\", [\n\t\t\t\t\t\t\t\t\t\t\"latest\",\n\t\t\t\t\t\t\t\t\t\t\"revision\",\n\t\t\t\t\t\t\t\t\t\tconstants.collectionBuilder.publishing.snapshotVersionType,\n\t\t\t\t\t\t\t\t\t]),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t]),\n\t\t\t\t\t]),\n\t\t\t\t);\n\n\t\t\tconst { main, count } = queryBuilder.main(\n\t\t\t\t{\n\t\t\t\t\tmain: query,\n\t\t\t\t\tcount: queryCount,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tqueryParams: {\n\t\t\t\t\t\tfilter: props.query.filter,\n\t\t\t\t\t\tsort: props.query.sort,\n\t\t\t\t\t\tpage: props.query.page,\n\t\t\t\t\t\tperPage: props.query.perPage,\n\t\t\t\t\t},\n\t\t\t\t\tdatabase: this.dbAdapter.config,\n\t\t\t\t\tmeta: {\n\t\t\t\t\t\ttableKeys: {\n\t\t\t\t\t\t\tfilters: {\n\t\t\t\t\t\t\t\tcreatedBy: `${dynamicConfig.tableName}.created_by`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsorts: {\n\t\t\t\t\t\t\t\tcreatedAt: `${dynamicConfig.tableName}.created_at`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tconst [mainResult, countResult] = await Promise.all([\n\t\t\t\tmain.execute() as unknown as Promise<RevisionsQueryResponse[]>,\n\t\t\t\tcount?.executeTakeFirst() as Promise<{ count: string } | undefined>,\n\t\t\t]);\n\n\t\t\treturn [mainResult, countResult] as const;\n\t\t};\n\n\t\tconst exec = await this.executeQuery(queryFn, {\n\t\t\tmethod: \"selectMultipleRevisions\",\n\t\t\ttableName: dynamicConfig.tableName,\n\t\t});\n\t\tif (exec.response.error) return exec.response;\n\n\t\treturn this.validateResponse(exec, {\n\t\t\tmode: \"multiple-count\",\n\t\t});\n\t}\n\t/**\n\t * Deletes all expired revisions for a collection.\n\t * A revision is considered expired if:\n\t * 1. It is older than the cutoff date\n\t * 2. It is not referenced by any non-revision version's promoted_from field\n\t */\n\tasync deleteExpiredRevisions(\n\t\tprops: {\n\t\t\tcutoffDate: string;\n\t\t},\n\t\tdynamicConfig: DynamicConfig<LucidVersionTableName>,\n\t) {\n\t\tconst { table } = this.db.dynamic;\n\t\tconst versionTable = dynamicConfig.tableName;\n\n\t\tconst queryFn = async () => {\n\t\t\tawait this.db\n\t\t\t\t.deleteFrom(versionTable)\n\t\t\t\t.where(`${versionTable}.type`, \"=\", \"revision\")\n\t\t\t\t.where(`${versionTable}.created_at`, \"<\", props.cutoffDate)\n\t\t\t\t.where(({ not, exists, selectFrom }) =>\n\t\t\t\t\tnot(\n\t\t\t\t\t\texists(\n\t\t\t\t\t\t\tselectFrom(table(versionTable).as(\"promoted\"))\n\t\t\t\t\t\t\t\t.select(sql.lit(1).as(\"one\"))\n\t\t\t\t\t\t\t\t.whereRef(\"promoted.promoted_from\", \"=\", `${versionTable}.id`)\n\t\t\t\t\t\t\t\t.where(\"promoted.type\", \"!=\", \"revision\"),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.execute();\n\n\t\t\treturn undefined;\n\t\t};\n\n\t\tconst exec = await this.executeQuery(queryFn, {\n\t\t\tmethod: \"deleteExpiredRevisions\",\n\t\t\ttableName: versionTable,\n\t\t});\n\n\t\treturn exec.response;\n\t}\n}\n"],"mappings":"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"}