{"version":3,"sources":["../../src/config/sanitize.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\n\nimport { en } from '@payloadcms/translations/languages/en'\nimport { deepMergeSimple } from '@payloadcms/translations/utilities'\n\nimport type { OrderableJoinInfo } from '../fields/config/sanitizeJoinField.js'\nimport type { CollectionSlug, GlobalSlug, SanitizedCollectionConfig } from '../index.js'\nimport type { SanitizedJobsConfig } from '../queues/config/types/index.js'\nimport type {\n  Config,\n  LocalizationConfigWithLabels,\n  LocalizationConfigWithNoLabels,\n  SanitizedConfig,\n  Timezone,\n  Widget,\n  WidgetInstance,\n} from './types.js'\n\nimport { defaultUserCollection } from '../auth/defaultUser.js'\nimport { authRootEndpoints } from '../auth/endpoints/index.js'\nimport { sanitizeCollection } from '../collections/config/sanitize.js'\nimport { migrationsCollection } from '../database/migrations/migrationsCollection.js'\nimport { DuplicateCollection, InvalidConfiguration } from '../errors/index.js'\nimport { defaultTimezones } from '../fields/baseFields/timezone/defaultTimezones.js'\nimport { addFolderCollection } from '../folders/addFolderCollection.js'\nimport { addFolderFieldToCollection } from '../folders/addFolderFieldToCollection.js'\nimport { sanitizeGlobal } from '../globals/config/sanitize.js'\nimport { baseBlockFields, formatLabels, sanitizeFields } from '../index.js'\nimport {\n  getLockedDocumentsCollection,\n  lockedDocumentsCollectionSlug,\n} from '../locked-documents/config.js'\nimport { getPreferencesCollection, preferencesCollectionSlug } from '../preferences/config.js'\nimport { getQueryPresetsConfig, queryPresetsCollectionSlug } from '../query-presets/config.js'\nimport { getDefaultJobsCollection, jobsCollectionSlug } from '../queues/config/collection.js'\nimport { getJobStatsGlobal } from '../queues/config/global.js'\nimport { flattenAllFields, flattenBlock } from '../utilities/flattenAllFields.js'\nimport { hasScheduledPublishEnabled } from '../utilities/getVersionsConfig.js'\nimport { validateTimezones } from '../utilities/validateTimezones.js'\nimport { getSchedulePublishTask } from '../versions/schedule/job.js'\nimport { addDefaultsToConfig } from './defaults.js'\nimport { addOrderableEndpoint, addOrderableFieldsAndHook } from './orderable/index.js'\n\nconst sanitizeAdminConfig = (configToSanitize: Config): Partial<SanitizedConfig> => {\n  const sanitizedConfig = { ...configToSanitize }\n\n  if (configToSanitize?.compatibility?.allowLocalizedWithinLocalized) {\n    process.env.NEXT_PUBLIC_PAYLOAD_COMPATIBILITY_allowLocalizedWithinLocalized = 'true'\n  }\n\n  // default logging level will be 'error' if not provided\n  sanitizedConfig.loggingLevels = {\n    Forbidden: 'info',\n    Locked: 'info',\n    MissingFile: 'info',\n    NotFound: 'info',\n    ValidationError: 'info',\n    ...(sanitizedConfig.loggingLevels || {}),\n  }\n  ;(sanitizedConfig.admin!.dashboard ??= { widgets: [] }).widgets.push({\n    slug: 'collections',\n    Component: '@payloadcms/next/rsc#CollectionCards',\n    minWidth: 'full',\n  })\n  sanitizedConfig.admin!.dashboard.defaultLayout ??= [\n    {\n      widgetSlug: 'collections',\n      width: 'full',\n    } satisfies WidgetInstance,\n  ]\n\n  // add default user collection if none provided\n  if (!sanitizedConfig?.admin?.user) {\n    const firstCollectionWithAuth = sanitizedConfig.collections!.find(({ auth }) => Boolean(auth))\n\n    if (firstCollectionWithAuth) {\n      sanitizedConfig.admin!.user = firstCollectionWithAuth.slug\n    } else {\n      sanitizedConfig.admin!.user = defaultUserCollection.slug\n      sanitizedConfig.collections!.push(defaultUserCollection)\n    }\n  }\n\n  const userCollection = sanitizedConfig.collections!.find(\n    ({ slug }) => slug === sanitizedConfig.admin!.user,\n  )\n\n  if (!userCollection || !userCollection.auth) {\n    throw new InvalidConfiguration(\n      `${sanitizedConfig.admin!.user} is not a valid admin user collection`,\n    )\n  }\n\n  if (sanitizedConfig?.admin?.timezones) {\n    if (typeof configToSanitize?.admin?.timezones?.supportedTimezones === 'function') {\n      sanitizedConfig.admin.timezones.supportedTimezones =\n        configToSanitize.admin.timezones.supportedTimezones({ defaultTimezones })\n    }\n\n    if (!sanitizedConfig?.admin?.timezones?.supportedTimezones) {\n      sanitizedConfig.admin.timezones.supportedTimezones = defaultTimezones\n    }\n  } else {\n    sanitizedConfig.admin!.timezones = {\n      supportedTimezones: defaultTimezones,\n    }\n  }\n\n  validateTimezones({\n    source: 'admin.timezones.supportedTimezones',\n    timezones: sanitizedConfig.admin!.timezones.supportedTimezones as Timezone[],\n  })\n\n  return sanitizedConfig as unknown as Partial<SanitizedConfig>\n}\n\nexport const sanitizeConfig = async (incomingConfig: Config): Promise<SanitizedConfig> => {\n  const configWithDefaults = addDefaultsToConfig(incomingConfig)\n\n  const config: Partial<SanitizedConfig> = sanitizeAdminConfig(configWithDefaults)\n\n  if (!config.endpoints) {\n    config.endpoints = []\n  }\n\n  for (const endpoint of authRootEndpoints) {\n    config.endpoints.push(endpoint)\n  }\n\n  if (config.localization && config.localization.locales?.length > 0) {\n    // clone localization config so to not break everything\n    const firstLocale = config.localization.locales[0]\n    if (typeof firstLocale === 'string') {\n      config.localization.localeCodes = [\n        ...(config.localization as unknown as LocalizationConfigWithNoLabels).locales,\n      ]\n\n      // is string[], so convert to Locale[]\n      config.localization.locales = (\n        config.localization as unknown as LocalizationConfigWithNoLabels\n      ).locales.map((locale) => ({\n        code: locale,\n        label: locale,\n        rtl: false,\n        toString: () => locale,\n      }))\n    } else {\n      // is Locale[], so convert to string[] for localeCodes\n      config.localization.localeCodes = config.localization.locales.map((locale) => locale.code)\n\n      config.localization.locales = (\n        config.localization as LocalizationConfigWithLabels\n      ).locales.map((locale) => ({\n        ...locale,\n        toString: () => locale.code,\n      }))\n    }\n\n    // Default fallback to true if not provided\n    config.localization.fallback = config.localization?.fallback ?? true\n  }\n\n  const i18nConfig: SanitizedConfig['i18n'] = {\n    fallbackLanguage: 'en',\n    supportedLanguages: {\n      en,\n    },\n    translations: {},\n  }\n\n  if (incomingConfig?.i18n) {\n    i18nConfig.supportedLanguages =\n      incomingConfig.i18n?.supportedLanguages || i18nConfig.supportedLanguages\n\n    const supportedLangKeys = <AcceptedLanguages[]>Object.keys(i18nConfig.supportedLanguages)\n    const fallbackLang = incomingConfig.i18n?.fallbackLanguage || i18nConfig.fallbackLanguage\n\n    i18nConfig.fallbackLanguage = supportedLangKeys.includes(fallbackLang)\n      ? fallbackLang\n      : supportedLangKeys[0]!\n    i18nConfig.translations =\n      (incomingConfig.i18n?.translations as SanitizedConfig['i18n']['translations']) ||\n      i18nConfig.translations\n  }\n\n  config.i18n = i18nConfig\n\n  const richTextSanitizationPromises: Array<(config: SanitizedConfig) => Promise<void>> = []\n\n  const schedulePublishCollections: CollectionSlug[] = []\n\n  const queryPresetsCollections: CollectionSlug[] = []\n\n  const schedulePublishGlobals: GlobalSlug[] = []\n\n  const collectionSlugs = new Set<CollectionSlug>()\n\n  const validRelationships = [\n    ...(config.collections?.map((c) => c.slug) ?? []),\n    jobsCollectionSlug,\n    lockedDocumentsCollectionSlug,\n    preferencesCollectionSlug,\n  ]\n\n  if (config.folders !== false) {\n    validRelationships.push(config.folders!.slug)\n  }\n\n  const dashboardWidgets = config.admin?.dashboard?.widgets ?? ([] as Widget[])\n\n  for (const widget of dashboardWidgets) {\n    if (widget.fields?.length) {\n      widget.fields = await sanitizeFields({\n        config: config as unknown as Config,\n        existingFieldNames: new Set(),\n        fields: widget.fields,\n        parentIsLocalized: false,\n        richTextSanitizationPromises,\n        validRelationships,\n      })\n    }\n  }\n\n  /**\n   * Blocks sanitization needs to happen before collections, as collection/global join field sanitization needs config.blocks\n   * to be populated with the sanitized blocks\n   */\n  config.blocks = []\n\n  if (incomingConfig.blocks?.length) {\n    for (const block of incomingConfig.blocks) {\n      const sanitizedBlock = block\n\n      if (sanitizedBlock._sanitized === true) {\n        continue\n      }\n      sanitizedBlock._sanitized = true\n\n      sanitizedBlock.fields = sanitizedBlock.fields.concat(baseBlockFields)\n\n      sanitizedBlock.labels = !sanitizedBlock.labels\n        ? formatLabels(sanitizedBlock.slug)\n        : sanitizedBlock.labels\n\n      sanitizedBlock.fields = await sanitizeFields({\n        config: config as unknown as Config,\n        existingFieldNames: new Set(),\n        fields: sanitizedBlock.fields,\n        parentIsLocalized: false,\n        richTextSanitizationPromises,\n        validRelationships,\n      })\n\n      const flattenedSanitizedBlock = flattenBlock({ block })\n\n      config.blocks.push(flattenedSanitizedBlock)\n    }\n  }\n\n  const folderEnabledCollections: SanitizedCollectionConfig[] = []\n\n  // Track orderable join fields during sanitization\n  const orderableJoins: OrderableJoinInfo[] = []\n\n  for (let i = 0; i < config.collections!.length; i++) {\n    if (collectionSlugs.has(config.collections![i]!.slug)) {\n      throw new DuplicateCollection('slug', config.collections![i]!.slug)\n    }\n\n    collectionSlugs.add(config.collections![i]!.slug)\n\n    const draftsConfig = config.collections![i]?.versions?.drafts\n\n    if (typeof draftsConfig === 'object' && draftsConfig.schedulePublish) {\n      schedulePublishCollections.push(config.collections![i]!.slug)\n    }\n\n    if (config.collections![i]!.enableQueryPresets) {\n      queryPresetsCollections.push(config.collections![i]!.slug)\n\n      if (!validRelationships.includes(queryPresetsCollectionSlug)) {\n        validRelationships.push(queryPresetsCollectionSlug)\n      }\n    }\n\n    if (config.folders !== false && config.collections![i]!.folders) {\n      addFolderFieldToCollection({\n        collection: config.collections![i]!,\n        collectionSpecific: config.folders!.collectionSpecific,\n        folderFieldName: config.folders!.fieldName,\n        folderSlug: config.folders!.slug,\n      })\n    }\n\n    config.collections![i] = await sanitizeCollection(\n      config as unknown as Config,\n      config.collections![i]!,\n      richTextSanitizationPromises,\n      validRelationships,\n      orderableJoins,\n    )\n\n    if (config.folders !== false && config.collections![i]!.folders) {\n      folderEnabledCollections.push(config.collections![i]!)\n    }\n  }\n\n  // Process orderable features after all collections are sanitized\n  const fieldsToAdd = new Map<SanitizedCollectionConfig, string[]>()\n  const joinFieldPathsByCollection = new Map<string, Map<string, string>>()\n\n  // Handle collection.orderable\n  for (const collection of config.collections!) {\n    if (collection.orderable) {\n      const currentFields = fieldsToAdd.get(collection) || []\n      fieldsToAdd.set(collection, [...currentFields, '_order'])\n      collection.defaultSort = collection.defaultSort ?? '_order'\n    }\n  }\n\n  // Handle orderable join fields (tracked during sanitization)\n  for (const joinInfo of orderableJoins) {\n    const targetCollection = config.collections!.find(\n      (c) => c.slug === joinInfo.targetCollectionSlug,\n    )\n    if (targetCollection) {\n      const currentFields = fieldsToAdd.get(targetCollection) || []\n      fieldsToAdd.set(targetCollection, [...currentFields, joinInfo.orderFieldName])\n\n      const currentJoinFieldPaths =\n        joinFieldPathsByCollection.get(targetCollection.slug) || new Map<string, string>()\n      currentJoinFieldPaths.set(joinInfo.orderFieldName, joinInfo.joinFieldOn)\n      joinFieldPathsByCollection.set(targetCollection.slug, currentJoinFieldPaths)\n    }\n  }\n\n  // Add fields, hooks, and update flattenedFields\n  for (const [collection, orderableFields] of fieldsToAdd) {\n    await addOrderableFieldsAndHook(\n      collection,\n      config as unknown as Config,\n      orderableFields,\n      joinFieldPathsByCollection,\n    )\n    // Regenerate flattenedFields since we added new fields\n    collection.flattenedFields = flattenAllFields({ fields: collection.fields })\n  }\n\n  // Add endpoint if any orderable features exist\n  if (fieldsToAdd.size > 0) {\n    addOrderableEndpoint(config as SanitizedConfig, joinFieldPathsByCollection)\n  }\n\n  if (config.globals!.length > 0) {\n    for (let i = 0; i < config.globals!.length; i++) {\n      if (hasScheduledPublishEnabled(config.globals![i]!)) {\n        schedulePublishGlobals.push(config.globals![i]!.slug)\n      }\n\n      config.globals![i] = await sanitizeGlobal(\n        config as unknown as Config,\n        config.globals![i]!,\n        richTextSanitizationPromises,\n        validRelationships,\n      )\n    }\n  }\n\n  if (schedulePublishCollections.length || schedulePublishGlobals.length) {\n    ;((config.jobs ??= {} as SanitizedJobsConfig).tasks ??= []).push(\n      getSchedulePublishTask({\n        adminUserSlug: config.admin!.user,\n        collections: schedulePublishCollections,\n        globals: schedulePublishGlobals,\n      }),\n    )\n  }\n\n  ;(config.jobs ??= {} as SanitizedJobsConfig).enabled = Boolean(\n    (Array.isArray(configWithDefaults.jobs?.tasks) && configWithDefaults.jobs?.tasks?.length) ||\n      (Array.isArray(configWithDefaults.jobs?.workflows) &&\n        configWithDefaults.jobs?.workflows?.length),\n  )\n\n  // Need to add default jobs collection before locked documents collections\n  if (config.jobs.enabled) {\n    // Check for schedule property in both tasks and workflows\n    const hasScheduleProperty =\n      (config?.jobs?.tasks?.length && config.jobs.tasks.some((task) => task.schedule)) ||\n      (config?.jobs?.workflows?.length &&\n        config.jobs.workflows.some((workflow) => workflow.schedule))\n\n    if (hasScheduleProperty) {\n      config.jobs.scheduling = true\n      // Add payload-jobs-stats global for tracking when a job of a specific slug was last run\n      ;(config.globals ??= []).push(\n        await sanitizeGlobal(\n          config as unknown as Config,\n          getJobStatsGlobal(config as unknown as Config),\n          richTextSanitizationPromises,\n          validRelationships,\n        ),\n      )\n\n      config.jobs.stats = true\n    }\n\n    let defaultJobsCollection = getDefaultJobsCollection(config.jobs)\n\n    if (typeof config.jobs.jobsCollectionOverrides === 'function') {\n      defaultJobsCollection = config.jobs.jobsCollectionOverrides({\n        defaultJobsCollection,\n      })\n\n      const hooks = defaultJobsCollection?.hooks\n      // @todo - delete this check in 4.0\n      if (hooks && config?.jobs?.runHooks !== true) {\n        for (const [hookKey, hook] of Object.entries(hooks)) {\n          const defaultAmount = hookKey === 'afterRead' || hookKey === 'beforeChange' ? 1 : 0\n          if (hook.length > defaultAmount) {\n            // eslint-disable-next-line no-console\n            console.warn(\n              `The jobsCollectionOverrides function is returning a collection with an additional ${hookKey} hook defined. These hooks will not run unless the jobs.runHooks option is set to true. Setting this option to true will negatively impact performance.`,\n            )\n            break\n          }\n        }\n      }\n    }\n    const sanitizedJobsCollection = await sanitizeCollection(\n      config as unknown as Config,\n      defaultJobsCollection,\n      richTextSanitizationPromises,\n      validRelationships,\n    )\n\n    ;(config.collections ??= []).push(sanitizedJobsCollection)\n  }\n\n  if (config.folders !== false && folderEnabledCollections.length) {\n    await addFolderCollection({\n      collectionSpecific: config.folders!.collectionSpecific,\n      config: config as unknown as Config,\n      folderEnabledCollections,\n      richTextSanitizationPromises,\n      validRelationships,\n    })\n  }\n\n  const lockedDocumentsCollection = getLockedDocumentsCollection(config as unknown as Config)\n\n  if (lockedDocumentsCollection) {\n    configWithDefaults.collections!.push(\n      await sanitizeCollection(\n        config as unknown as Config,\n        lockedDocumentsCollection,\n        richTextSanitizationPromises,\n        validRelationships,\n      ),\n    )\n  }\n\n  configWithDefaults.collections!.push(\n    await sanitizeCollection(\n      config as unknown as Config,\n      getPreferencesCollection(config as unknown as Config),\n      richTextSanitizationPromises,\n      validRelationships,\n    ),\n  )\n\n  const migrations = await sanitizeCollection(\n    config as unknown as Config,\n    migrationsCollection,\n    richTextSanitizationPromises,\n    validRelationships,\n  )\n\n  // @ts-expect-error indexSortableFields is only valid for @payloadcms/db-mongodb\n  if (config?.db?.indexSortableFields) {\n    migrations.indexes = [\n      {\n        fields: ['batch', 'name'],\n        unique: false,\n      },\n    ]\n  }\n  configWithDefaults.collections!.push(migrations)\n\n  if (queryPresetsCollections.length > 0) {\n    configWithDefaults.collections!.push(\n      await sanitizeCollection(\n        config as unknown as Config,\n        getQueryPresetsConfig(config as unknown as Config),\n        richTextSanitizationPromises,\n        validRelationships,\n      ),\n    )\n  }\n\n  if (config.serverURL !== '') {\n    config.csrf!.push(config.serverURL!)\n  }\n\n  const uploadAdapters = new Set<string>()\n  // interact with all collections\n  for (const collection of config.collections!) {\n    // deduped upload adapters\n    if (collection.upload?.adapter) {\n      uploadAdapters.add(collection.upload.adapter)\n    }\n  }\n\n  if (!config.upload) {\n    config.upload = { adapters: [] }\n  }\n\n  config.upload.adapters = Array.from(\n    new Set(config.collections!.map((c) => c.upload?.adapter).filter(Boolean) as string[]),\n  )\n\n  // Pass through the email config as is so adapters don't break\n  if (incomingConfig.email) {\n    config.email = incomingConfig.email\n  }\n\n  /*\n    Execute richText sanitization\n   */\n  if (typeof incomingConfig.editor === 'function') {\n    config.editor = await incomingConfig.editor({\n      config: config as SanitizedConfig,\n      isRoot: true,\n      parentIsLocalized: false,\n    })\n    if (config.editor.i18n && Object.keys(config.editor.i18n).length >= 0) {\n      config.i18n.translations = deepMergeSimple(config.i18n.translations, config.editor.i18n)\n    }\n  }\n\n  const promises: Promise<void>[] = []\n\n  for (const sanitizeFunction of richTextSanitizationPromises) {\n    promises.push(sanitizeFunction(config as SanitizedConfig))\n  }\n\n  await Promise.all(promises)\n\n  return config as SanitizedConfig\n}\n"],"names":["en","deepMergeSimple","defaultUserCollection","authRootEndpoints","sanitizeCollection","migrationsCollection","DuplicateCollection","InvalidConfiguration","defaultTimezones","addFolderCollection","addFolderFieldToCollection","sanitizeGlobal","baseBlockFields","formatLabels","sanitizeFields","getLockedDocumentsCollection","lockedDocumentsCollectionSlug","getPreferencesCollection","preferencesCollectionSlug","getQueryPresetsConfig","queryPresetsCollectionSlug","getDefaultJobsCollection","jobsCollectionSlug","getJobStatsGlobal","flattenAllFields","flattenBlock","hasScheduledPublishEnabled","validateTimezones","getSchedulePublishTask","addDefaultsToConfig","addOrderableEndpoint","addOrderableFieldsAndHook","sanitizeAdminConfig","configToSanitize","sanitizedConfig","compatibility","allowLocalizedWithinLocalized","process","env","NEXT_PUBLIC_PAYLOAD_COMPATIBILITY_allowLocalizedWithinLocalized","loggingLevels","Forbidden","Locked","MissingFile","NotFound","ValidationError","admin","dashboard","widgets","push","slug","Component","minWidth","defaultLayout","widgetSlug","width","user","firstCollectionWithAuth","collections","find","auth","Boolean","userCollection","timezones","supportedTimezones","source","sanitizeConfig","incomingConfig","configWithDefaults","config","endpoints","endpoint","localization","locales","length","firstLocale","localeCodes","map","locale","code","label","rtl","toString","fallback","i18nConfig","fallbackLanguage","supportedLanguages","translations","i18n","supportedLangKeys","Object","keys","fallbackLang","includes","richTextSanitizationPromises","schedulePublishCollections","queryPresetsCollections","schedulePublishGlobals","collectionSlugs","Set","validRelationships","c","folders","dashboardWidgets","widget","fields","existingFieldNames","parentIsLocalized","blocks","block","sanitizedBlock","_sanitized","concat","labels","flattenedSanitizedBlock","folderEnabledCollections","orderableJoins","i","has","add","draftsConfig","versions","drafts","schedulePublish","enableQueryPresets","collection","collectionSpecific","folderFieldName","fieldName","folderSlug","fieldsToAdd","Map","joinFieldPathsByCollection","orderable","currentFields","get","set","defaultSort","joinInfo","targetCollection","targetCollectionSlug","orderFieldName","currentJoinFieldPaths","joinFieldOn","orderableFields","flattenedFields","size","globals","jobs","tasks","adminUserSlug","enabled","Array","isArray","workflows","hasScheduleProperty","some","task","schedule","workflow","scheduling","stats","defaultJobsCollection","jobsCollectionOverrides","hooks","runHooks","hookKey","hook","entries","defaultAmount","console","warn","sanitizedJobsCollection","lockedDocumentsCollection","migrations","db","indexSortableFields","indexes","unique","serverURL","csrf","uploadAdapters","upload","adapter","adapters","from","filter","email","editor","isRoot","promises","sanitizeFunction","Promise","all"],"mappings":"AAEA,SAASA,EAAE,QAAQ,wCAAuC;AAC1D,SAASC,eAAe,QAAQ,qCAAoC;AAepE,SAASC,qBAAqB,QAAQ,yBAAwB;AAC9D,SAASC,iBAAiB,QAAQ,6BAA4B;AAC9D,SAASC,kBAAkB,QAAQ,oCAAmC;AACtE,SAASC,oBAAoB,QAAQ,iDAAgD;AACrF,SAASC,mBAAmB,EAAEC,oBAAoB,QAAQ,qBAAoB;AAC9E,SAASC,gBAAgB,QAAQ,oDAAmD;AACpF,SAASC,mBAAmB,QAAQ,oCAAmC;AACvE,SAASC,0BAA0B,QAAQ,2CAA0C;AACrF,SAASC,cAAc,QAAQ,gCAA+B;AAC9D,SAASC,eAAe,EAAEC,YAAY,EAAEC,cAAc,QAAQ,cAAa;AAC3E,SACEC,4BAA4B,EAC5BC,6BAA6B,QACxB,gCAA+B;AACtC,SAASC,wBAAwB,EAAEC,yBAAyB,QAAQ,2BAA0B;AAC9F,SAASC,qBAAqB,EAAEC,0BAA0B,QAAQ,6BAA4B;AAC9F,SAASC,wBAAwB,EAAEC,kBAAkB,QAAQ,iCAAgC;AAC7F,SAASC,iBAAiB,QAAQ,6BAA4B;AAC9D,SAASC,gBAAgB,EAAEC,YAAY,QAAQ,mCAAkC;AACjF,SAASC,0BAA0B,QAAQ,oCAAmC;AAC9E,SAASC,iBAAiB,QAAQ,oCAAmC;AACrE,SAASC,sBAAsB,QAAQ,8BAA6B;AACpE,SAASC,mBAAmB,QAAQ,gBAAe;AACnD,SAASC,oBAAoB,EAAEC,yBAAyB,QAAQ,uBAAsB;AAEtF,MAAMC,sBAAsB,CAACC;IAC3B,MAAMC,kBAAkB;QAAE,GAAGD,gBAAgB;IAAC;IAE9C,IAAIA,kBAAkBE,eAAeC,+BAA+B;QAClEC,QAAQC,GAAG,CAACC,+DAA+D,GAAG;IAChF;IAEA,wDAAwD;IACxDL,gBAAgBM,aAAa,GAAG;QAC9BC,WAAW;QACXC,QAAQ;QACRC,aAAa;QACbC,UAAU;QACVC,iBAAiB;QACjB,GAAIX,gBAAgBM,aAAa,IAAI,CAAC,CAAC;IACzC;IACEN,CAAAA,gBAAgBY,KAAK,CAAEC,SAAS,KAAK;QAAEC,SAAS,EAAE;IAAC,CAAA,EAAGA,OAAO,CAACC,IAAI,CAAC;QACnEC,MAAM;QACNC,WAAW;QACXC,UAAU;IACZ;IACAlB,gBAAgBY,KAAK,CAAEC,SAAS,CAACM,aAAa,KAAK;QACjD;YACEC,YAAY;YACZC,OAAO;QACT;KACD;IAED,+CAA+C;IAC/C,IAAI,CAACrB,iBAAiBY,OAAOU,MAAM;QACjC,MAAMC,0BAA0BvB,gBAAgBwB,WAAW,CAAEC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKC,QAAQD;QAExF,IAAIH,yBAAyB;YAC3BvB,gBAAgBY,KAAK,CAAEU,IAAI,GAAGC,wBAAwBP,IAAI;QAC5D,OAAO;YACLhB,gBAAgBY,KAAK,CAAEU,IAAI,GAAGtD,sBAAsBgD,IAAI;YACxDhB,gBAAgBwB,WAAW,CAAET,IAAI,CAAC/C;QACpC;IACF;IAEA,MAAM4D,iBAAiB5B,gBAAgBwB,WAAW,CAAEC,IAAI,CACtD,CAAC,EAAET,IAAI,EAAE,GAAKA,SAAShB,gBAAgBY,KAAK,CAAEU,IAAI;IAGpD,IAAI,CAACM,kBAAkB,CAACA,eAAeF,IAAI,EAAE;QAC3C,MAAM,IAAIrD,qBACR,GAAG2B,gBAAgBY,KAAK,CAAEU,IAAI,CAAC,qCAAqC,CAAC;IAEzE;IAEA,IAAItB,iBAAiBY,OAAOiB,WAAW;QACrC,IAAI,OAAO9B,kBAAkBa,OAAOiB,WAAWC,uBAAuB,YAAY;YAChF9B,gBAAgBY,KAAK,CAACiB,SAAS,CAACC,kBAAkB,GAChD/B,iBAAiBa,KAAK,CAACiB,SAAS,CAACC,kBAAkB,CAAC;gBAAExD;YAAiB;QAC3E;QAEA,IAAI,CAAC0B,iBAAiBY,OAAOiB,WAAWC,oBAAoB;YAC1D9B,gBAAgBY,KAAK,CAACiB,SAAS,CAACC,kBAAkB,GAAGxD;QACvD;IACF,OAAO;QACL0B,gBAAgBY,KAAK,CAAEiB,SAAS,GAAG;YACjCC,oBAAoBxD;QACtB;IACF;IAEAmB,kBAAkB;QAChBsC,QAAQ;QACRF,WAAW7B,gBAAgBY,KAAK,CAAEiB,SAAS,CAACC,kBAAkB;IAChE;IAEA,OAAO9B;AACT;AAEA,OAAO,MAAMgC,iBAAiB,OAAOC;IACnC,MAAMC,qBAAqBvC,oBAAoBsC;IAE/C,MAAME,SAAmCrC,oBAAoBoC;IAE7D,IAAI,CAACC,OAAOC,SAAS,EAAE;QACrBD,OAAOC,SAAS,GAAG,EAAE;IACvB;IAEA,KAAK,MAAMC,YAAYpE,kBAAmB;QACxCkE,OAAOC,SAAS,CAACrB,IAAI,CAACsB;IACxB;IAEA,IAAIF,OAAOG,YAAY,IAAIH,OAAOG,YAAY,CAACC,OAAO,EAAEC,SAAS,GAAG;QAClE,uDAAuD;QACvD,MAAMC,cAAcN,OAAOG,YAAY,CAACC,OAAO,CAAC,EAAE;QAClD,IAAI,OAAOE,gBAAgB,UAAU;YACnCN,OAAOG,YAAY,CAACI,WAAW,GAAG;mBAC7B,AAACP,OAAOG,YAAY,CAA+CC,OAAO;aAC9E;YAED,sCAAsC;YACtCJ,OAAOG,YAAY,CAACC,OAAO,GAAG,AAC5BJ,OAAOG,YAAY,CACnBC,OAAO,CAACI,GAAG,CAAC,CAACC,SAAY,CAAA;oBACzBC,MAAMD;oBACNE,OAAOF;oBACPG,KAAK;oBACLC,UAAU,IAAMJ;gBAClB,CAAA;QACF,OAAO;YACL,sDAAsD;YACtDT,OAAOG,YAAY,CAACI,WAAW,GAAGP,OAAOG,YAAY,CAACC,OAAO,CAACI,GAAG,CAAC,CAACC,SAAWA,OAAOC,IAAI;YAEzFV,OAAOG,YAAY,CAACC,OAAO,GAAG,AAC5BJ,OAAOG,YAAY,CACnBC,OAAO,CAACI,GAAG,CAAC,CAACC,SAAY,CAAA;oBACzB,GAAGA,MAAM;oBACTI,UAAU,IAAMJ,OAAOC,IAAI;gBAC7B,CAAA;QACF;QAEA,2CAA2C;QAC3CV,OAAOG,YAAY,CAACW,QAAQ,GAAGd,OAAOG,YAAY,EAAEW,YAAY;IAClE;IAEA,MAAMC,aAAsC;QAC1CC,kBAAkB;QAClBC,oBAAoB;YAClBtF;QACF;QACAuF,cAAc,CAAC;IACjB;IAEA,IAAIpB,gBAAgBqB,MAAM;QACxBJ,WAAWE,kBAAkB,GAC3BnB,eAAeqB,IAAI,EAAEF,sBAAsBF,WAAWE,kBAAkB;QAE1E,MAAMG,oBAAyCC,OAAOC,IAAI,CAACP,WAAWE,kBAAkB;QACxF,MAAMM,eAAezB,eAAeqB,IAAI,EAAEH,oBAAoBD,WAAWC,gBAAgB;QAEzFD,WAAWC,gBAAgB,GAAGI,kBAAkBI,QAAQ,CAACD,gBACrDA,eACAH,iBAAiB,CAAC,EAAE;QACxBL,WAAWG,YAAY,GACrB,AAACpB,eAAeqB,IAAI,EAAED,gBACtBH,WAAWG,YAAY;IAC3B;IAEAlB,OAAOmB,IAAI,GAAGJ;IAEd,MAAMU,+BAAkF,EAAE;IAE1F,MAAMC,6BAA+C,EAAE;IAEvD,MAAMC,0BAA4C,EAAE;IAEpD,MAAMC,yBAAuC,EAAE;IAE/C,MAAMC,kBAAkB,IAAIC;IAE5B,MAAMC,qBAAqB;WACrB/B,OAAOX,WAAW,EAAEmB,IAAI,CAACwB,IAAMA,EAAEnD,IAAI,KAAK,EAAE;QAChD5B;QACAN;QACAE;KACD;IAED,IAAImD,OAAOiC,OAAO,KAAK,OAAO;QAC5BF,mBAAmBnD,IAAI,CAACoB,OAAOiC,OAAO,CAAEpD,IAAI;IAC9C;IAEA,MAAMqD,mBAAmBlC,OAAOvB,KAAK,EAAEC,WAAWC,WAAY,EAAE;IAEhE,KAAK,MAAMwD,UAAUD,iBAAkB;QACrC,IAAIC,OAAOC,MAAM,EAAE/B,QAAQ;YACzB8B,OAAOC,MAAM,GAAG,MAAM3F,eAAe;gBACnCuD,QAAQA;gBACRqC,oBAAoB,IAAIP;gBACxBM,QAAQD,OAAOC,MAAM;gBACrBE,mBAAmB;gBACnBb;gBACAM;YACF;QACF;IACF;IAEA;;;GAGC,GACD/B,OAAOuC,MAAM,GAAG,EAAE;IAElB,IAAIzC,eAAeyC,MAAM,EAAElC,QAAQ;QACjC,KAAK,MAAMmC,SAAS1C,eAAeyC,MAAM,CAAE;YACzC,MAAME,iBAAiBD;YAEvB,IAAIC,eAAeC,UAAU,KAAK,MAAM;gBACtC;YACF;YACAD,eAAeC,UAAU,GAAG;YAE5BD,eAAeL,MAAM,GAAGK,eAAeL,MAAM,CAACO,MAAM,CAACpG;YAErDkG,eAAeG,MAAM,GAAG,CAACH,eAAeG,MAAM,GAC1CpG,aAAaiG,eAAe5D,IAAI,IAChC4D,eAAeG,MAAM;YAEzBH,eAAeL,MAAM,GAAG,MAAM3F,eAAe;gBAC3CuD,QAAQA;gBACRqC,oBAAoB,IAAIP;gBACxBM,QAAQK,eAAeL,MAAM;gBAC7BE,mBAAmB;gBACnBb;gBACAM;YACF;YAEA,MAAMc,0BAA0BzF,aAAa;gBAAEoF;YAAM;YAErDxC,OAAOuC,MAAM,CAAC3D,IAAI,CAACiE;QACrB;IACF;IAEA,MAAMC,2BAAwD,EAAE;IAEhE,kDAAkD;IAClD,MAAMC,iBAAsC,EAAE;IAE9C,IAAK,IAAIC,IAAI,GAAGA,IAAIhD,OAAOX,WAAW,CAAEgB,MAAM,EAAE2C,IAAK;QACnD,IAAInB,gBAAgBoB,GAAG,CAACjD,OAAOX,WAAW,AAAC,CAAC2D,EAAE,CAAEnE,IAAI,GAAG;YACrD,MAAM,IAAI5C,oBAAoB,QAAQ+D,OAAOX,WAAW,AAAC,CAAC2D,EAAE,CAAEnE,IAAI;QACpE;QAEAgD,gBAAgBqB,GAAG,CAAClD,OAAOX,WAAW,AAAC,CAAC2D,EAAE,CAAEnE,IAAI;QAEhD,MAAMsE,eAAenD,OAAOX,WAAW,AAAC,CAAC2D,EAAE,EAAEI,UAAUC;QAEvD,IAAI,OAAOF,iBAAiB,YAAYA,aAAaG,eAAe,EAAE;YACpE5B,2BAA2B9C,IAAI,CAACoB,OAAOX,WAAW,AAAC,CAAC2D,EAAE,CAAEnE,IAAI;QAC9D;QAEA,IAAImB,OAAOX,WAAW,AAAC,CAAC2D,EAAE,CAAEO,kBAAkB,EAAE;YAC9C5B,wBAAwB/C,IAAI,CAACoB,OAAOX,WAAW,AAAC,CAAC2D,EAAE,CAAEnE,IAAI;YAEzD,IAAI,CAACkD,mBAAmBP,QAAQ,CAACzE,6BAA6B;gBAC5DgF,mBAAmBnD,IAAI,CAAC7B;YAC1B;QACF;QAEA,IAAIiD,OAAOiC,OAAO,KAAK,SAASjC,OAAOX,WAAW,AAAC,CAAC2D,EAAE,CAAEf,OAAO,EAAE;YAC/D5F,2BAA2B;gBACzBmH,YAAYxD,OAAOX,WAAW,AAAC,CAAC2D,EAAE;gBAClCS,oBAAoBzD,OAAOiC,OAAO,CAAEwB,kBAAkB;gBACtDC,iBAAiB1D,OAAOiC,OAAO,CAAE0B,SAAS;gBAC1CC,YAAY5D,OAAOiC,OAAO,CAAEpD,IAAI;YAClC;QACF;QAEAmB,OAAOX,WAAW,AAAC,CAAC2D,EAAE,GAAG,MAAMjH,mBAC7BiE,QACAA,OAAOX,WAAW,AAAC,CAAC2D,EAAE,EACtBvB,8BACAM,oBACAgB;QAGF,IAAI/C,OAAOiC,OAAO,KAAK,SAASjC,OAAOX,WAAW,AAAC,CAAC2D,EAAE,CAAEf,OAAO,EAAE;YAC/Da,yBAAyBlE,IAAI,CAACoB,OAAOX,WAAW,AAAC,CAAC2D,EAAE;QACtD;IACF;IAEA,iEAAiE;IACjE,MAAMa,cAAc,IAAIC;IACxB,MAAMC,6BAA6B,IAAID;IAEvC,8BAA8B;IAC9B,KAAK,MAAMN,cAAcxD,OAAOX,WAAW,CAAG;QAC5C,IAAImE,WAAWQ,SAAS,EAAE;YACxB,MAAMC,gBAAgBJ,YAAYK,GAAG,CAACV,eAAe,EAAE;YACvDK,YAAYM,GAAG,CAACX,YAAY;mBAAIS;gBAAe;aAAS;YACxDT,WAAWY,WAAW,GAAGZ,WAAWY,WAAW,IAAI;QACrD;IACF;IAEA,6DAA6D;IAC7D,KAAK,MAAMC,YAAYtB,eAAgB;QACrC,MAAMuB,mBAAmBtE,OAAOX,WAAW,CAAEC,IAAI,CAC/C,CAAC0C,IAAMA,EAAEnD,IAAI,KAAKwF,SAASE,oBAAoB;QAEjD,IAAID,kBAAkB;YACpB,MAAML,gBAAgBJ,YAAYK,GAAG,CAACI,qBAAqB,EAAE;YAC7DT,YAAYM,GAAG,CAACG,kBAAkB;mBAAIL;gBAAeI,SAASG,cAAc;aAAC;YAE7E,MAAMC,wBACJV,2BAA2BG,GAAG,CAACI,iBAAiBzF,IAAI,KAAK,IAAIiF;YAC/DW,sBAAsBN,GAAG,CAACE,SAASG,cAAc,EAAEH,SAASK,WAAW;YACvEX,2BAA2BI,GAAG,CAACG,iBAAiBzF,IAAI,EAAE4F;QACxD;IACF;IAEA,gDAAgD;IAChD,KAAK,MAAM,CAACjB,YAAYmB,gBAAgB,IAAId,YAAa;QACvD,MAAMnG,0BACJ8F,YACAxD,QACA2E,iBACAZ;QAEF,uDAAuD;QACvDP,WAAWoB,eAAe,GAAGzH,iBAAiB;YAAEiF,QAAQoB,WAAWpB,MAAM;QAAC;IAC5E;IAEA,+CAA+C;IAC/C,IAAIyB,YAAYgB,IAAI,GAAG,GAAG;QACxBpH,qBAAqBuC,QAA2B+D;IAClD;IAEA,IAAI/D,OAAO8E,OAAO,CAAEzE,MAAM,GAAG,GAAG;QAC9B,IAAK,IAAI2C,IAAI,GAAGA,IAAIhD,OAAO8E,OAAO,CAAEzE,MAAM,EAAE2C,IAAK;YAC/C,IAAI3F,2BAA2B2C,OAAO8E,OAAO,AAAC,CAAC9B,EAAE,GAAI;gBACnDpB,uBAAuBhD,IAAI,CAACoB,OAAO8E,OAAO,AAAC,CAAC9B,EAAE,CAAEnE,IAAI;YACtD;YAEAmB,OAAO8E,OAAO,AAAC,CAAC9B,EAAE,GAAG,MAAM1G,eACzB0D,QACAA,OAAO8E,OAAO,AAAC,CAAC9B,EAAE,EAClBvB,8BACAM;QAEJ;IACF;IAEA,IAAIL,2BAA2BrB,MAAM,IAAIuB,uBAAuBvB,MAAM,EAAE;;QACpE,CAAA,AAACL,CAAAA,OAAO+E,IAAI,KAAK,CAAC,CAAuB,EAAGC,KAAK,KAAK,EAAE,AAAD,EAAGpG,IAAI,CAC9DrB,uBAAuB;YACrB0H,eAAejF,OAAOvB,KAAK,CAAEU,IAAI;YACjCE,aAAaqC;YACboD,SAASlD;QACX;IAEJ;;IAEE5B,CAAAA,OAAO+E,IAAI,KAAK,CAAC,CAAuB,EAAGG,OAAO,GAAG1F,QACrD,AAAC2F,MAAMC,OAAO,CAACrF,mBAAmBgF,IAAI,EAAEC,UAAUjF,mBAAmBgF,IAAI,EAAEC,OAAO3E,UAC/E8E,MAAMC,OAAO,CAACrF,mBAAmBgF,IAAI,EAAEM,cACtCtF,mBAAmBgF,IAAI,EAAEM,WAAWhF;IAG1C,0EAA0E;IAC1E,IAAIL,OAAO+E,IAAI,CAACG,OAAO,EAAE;QACvB,0DAA0D;QAC1D,MAAMI,sBACJ,AAACtF,QAAQ+E,MAAMC,OAAO3E,UAAUL,OAAO+E,IAAI,CAACC,KAAK,CAACO,IAAI,CAAC,CAACC,OAASA,KAAKC,QAAQ,KAC7EzF,QAAQ+E,MAAMM,WAAWhF,UACxBL,OAAO+E,IAAI,CAACM,SAAS,CAACE,IAAI,CAAC,CAACG,WAAaA,SAASD,QAAQ;QAE9D,IAAIH,qBAAqB;YACvBtF,OAAO+E,IAAI,CAACY,UAAU,GAAG;YAEvB3F,CAAAA,OAAO8E,OAAO,KAAK,EAAE,AAAD,EAAGlG,IAAI,CAC3B,MAAMtC,eACJ0D,QACA9C,kBAAkB8C,SAClByB,8BACAM;YAIJ/B,OAAO+E,IAAI,CAACa,KAAK,GAAG;QACtB;QAEA,IAAIC,wBAAwB7I,yBAAyBgD,OAAO+E,IAAI;QAEhE,IAAI,OAAO/E,OAAO+E,IAAI,CAACe,uBAAuB,KAAK,YAAY;YAC7DD,wBAAwB7F,OAAO+E,IAAI,CAACe,uBAAuB,CAAC;gBAC1DD;YACF;YAEA,MAAME,QAAQF,uBAAuBE;YACrC,mCAAmC;YACnC,IAAIA,SAAS/F,QAAQ+E,MAAMiB,aAAa,MAAM;gBAC5C,KAAK,MAAM,CAACC,SAASC,KAAK,IAAI7E,OAAO8E,OAAO,CAACJ,OAAQ;oBACnD,MAAMK,gBAAgBH,YAAY,eAAeA,YAAY,iBAAiB,IAAI;oBAClF,IAAIC,KAAK7F,MAAM,GAAG+F,eAAe;wBAC/B,sCAAsC;wBACtCC,QAAQC,IAAI,CACV,CAAC,kFAAkF,EAAEL,QAAQ,uJAAuJ,CAAC;wBAEvP;oBACF;gBACF;YACF;QACF;QACA,MAAMM,0BAA0B,MAAMxK,mBACpCiE,QACA6F,uBACApE,8BACAM;QAGA/B,CAAAA,OAAOX,WAAW,KAAK,EAAE,AAAD,EAAGT,IAAI,CAAC2H;IACpC;IAEA,IAAIvG,OAAOiC,OAAO,KAAK,SAASa,yBAAyBzC,MAAM,EAAE;QAC/D,MAAMjE,oBAAoB;YACxBqH,oBAAoBzD,OAAOiC,OAAO,CAAEwB,kBAAkB;YACtDzD,QAAQA;YACR8C;YACArB;YACAM;QACF;IACF;IAEA,MAAMyE,4BAA4B9J,6BAA6BsD;IAE/D,IAAIwG,2BAA2B;QAC7BzG,mBAAmBV,WAAW,CAAET,IAAI,CAClC,MAAM7C,mBACJiE,QACAwG,2BACA/E,8BACAM;IAGN;IAEAhC,mBAAmBV,WAAW,CAAET,IAAI,CAClC,MAAM7C,mBACJiE,QACApD,yBAAyBoD,SACzByB,8BACAM;IAIJ,MAAM0E,aAAa,MAAM1K,mBACvBiE,QACAhE,sBACAyF,8BACAM;IAGF,gFAAgF;IAChF,IAAI/B,QAAQ0G,IAAIC,qBAAqB;QACnCF,WAAWG,OAAO,GAAG;YACnB;gBACExE,QAAQ;oBAAC;oBAAS;iBAAO;gBACzByE,QAAQ;YACV;SACD;IACH;IACA9G,mBAAmBV,WAAW,CAAET,IAAI,CAAC6H;IAErC,IAAI9E,wBAAwBtB,MAAM,GAAG,GAAG;QACtCN,mBAAmBV,WAAW,CAAET,IAAI,CAClC,MAAM7C,mBACJiE,QACAlD,sBAAsBkD,SACtByB,8BACAM;IAGN;IAEA,IAAI/B,OAAO8G,SAAS,KAAK,IAAI;QAC3B9G,OAAO+G,IAAI,CAAEnI,IAAI,CAACoB,OAAO8G,SAAS;IACpC;IAEA,MAAME,iBAAiB,IAAIlF;IAC3B,gCAAgC;IAChC,KAAK,MAAM0B,cAAcxD,OAAOX,WAAW,CAAG;QAC5C,0BAA0B;QAC1B,IAAImE,WAAWyD,MAAM,EAAEC,SAAS;YAC9BF,eAAe9D,GAAG,CAACM,WAAWyD,MAAM,CAACC,OAAO;QAC9C;IACF;IAEA,IAAI,CAAClH,OAAOiH,MAAM,EAAE;QAClBjH,OAAOiH,MAAM,GAAG;YAAEE,UAAU,EAAE;QAAC;IACjC;IAEAnH,OAAOiH,MAAM,CAACE,QAAQ,GAAGhC,MAAMiC,IAAI,CACjC,IAAItF,IAAI9B,OAAOX,WAAW,CAAEmB,GAAG,CAAC,CAACwB,IAAMA,EAAEiF,MAAM,EAAEC,SAASG,MAAM,CAAC7H;IAGnE,8DAA8D;IAC9D,IAAIM,eAAewH,KAAK,EAAE;QACxBtH,OAAOsH,KAAK,GAAGxH,eAAewH,KAAK;IACrC;IAEA;;GAEC,GACD,IAAI,OAAOxH,eAAeyH,MAAM,KAAK,YAAY;QAC/CvH,OAAOuH,MAAM,GAAG,MAAMzH,eAAeyH,MAAM,CAAC;YAC1CvH,QAAQA;YACRwH,QAAQ;YACRlF,mBAAmB;QACrB;QACA,IAAItC,OAAOuH,MAAM,CAACpG,IAAI,IAAIE,OAAOC,IAAI,CAACtB,OAAOuH,MAAM,CAACpG,IAAI,EAAEd,MAAM,IAAI,GAAG;YACrEL,OAAOmB,IAAI,CAACD,YAAY,GAAGtF,gBAAgBoE,OAAOmB,IAAI,CAACD,YAAY,EAAElB,OAAOuH,MAAM,CAACpG,IAAI;QACzF;IACF;IAEA,MAAMsG,WAA4B,EAAE;IAEpC,KAAK,MAAMC,oBAAoBjG,6BAA8B;QAC3DgG,SAAS7I,IAAI,CAAC8I,iBAAiB1H;IACjC;IAEA,MAAM2H,QAAQC,GAAG,CAACH;IAElB,OAAOzH;AACT,EAAC"}