{"version":3,"file":"ConflictPicker-CWBf0soh.mjs","sources":["../../lib/components/ConflictPicker/ConflictPickerEntry.vue","../../lib/components/ConflictPicker/ConflictPicker.vue"],"sourcesContent":["<!--\n  - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { INode } from '@nextcloud/files'\nimport type { ConflictInput } from '../../conflict-picker.ts'\n\nimport { mdiFile, mdiFolder } from '@mdi/js'\nimport { FileType } from '@nextcloud/files'\nimport { computed, ref, watch } from 'vue'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'\nimport NcDateTime from '@nextcloud/vue/components/NcDateTime'\nimport NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'\nimport { getPreviewURL } from '../../composables/preview.ts'\nimport { t } from '../../utils/l10n.ts'\n\n/**\n * Is the existing node selected\n */\nconst existingSelected = defineModel<boolean>('existingSelected', { required: true })\n\n/**\n * Is the incoming node selected\n */\nconst incomingSelected = defineModel<boolean>('incomingSelected', { required: true })\n\nconst props = defineProps<{\n\t/**\n\t * The existing node\n\t */\n\texisting: INode\n\n\t/**\n\t * The new incoming node\n\t */\n\tincoming: ConflictInput\n}>()\n\ndefineExpose({ validate })\n\nconst isFileSystemEntry = (o: unknown): o is FileSystemEntry => 'FileSystemEntry' in window && o instanceof window.FileSystemEntry\nconst isFileSystemFileEntry = (o: unknown): o is FileSystemFileEntry => 'FileSystemFileEntry' in window && o instanceof window.FileSystemFileEntry\n\nconst PREVIEW_SIZE = 64\n\nconst validationMessage = ref('')\n\nconst incomingPreview = ref<string>()\nconst existingPreview = ref<string>()\n\nconst incomingMTime = ref<Date>()\nconst existingMTime = ref<Date>()\n\nconst incomingSize = ref<number>()\nconst existingSize = ref<number>()\n\nconst conflictResolved = computed(() => incomingSelected.value || existingSelected.value)\n\nconst isExistingFolder = computed(() => props.existing.type === FileType.Folder)\nconst isIncomingFolder = computed(() => {\n\tif (isFileSystemEntry(props.incoming)) {\n\t\treturn props.incoming.isDirectory\n\t} else if (props.incoming instanceof File) {\n\t\treturn false\n\t}\n\treturn props.incoming.type === FileType.Folder\n})\n\nwatch(() => props.existing, async () => {\n\texistingMTime.value = getMTime(props.existing)\n\texistingSize.value = getSize(props.existing)\n\texistingPreview.value = await getPreview(props.existing)\n})\n\nwatch(() => props.incoming, async () => {\n\tconst file = await getFileOrNode(props.incoming)\n\tif (file === null) {\n\t\treturn\n\t}\n\n\tincomingMTime.value = getMTime(file)\n\tincomingSize.value = getSize(file)\n\tincomingPreview.value = await getPreview(file)\n})\n\n/**\n * If the input is a filesystem file entry the file is loaded and returned.\n * In case of a directory null is returned.\n * Otherwise the INode or File is returned.\n *\n * @param input - The conflict input\n */\nasync function getFileOrNode(input: ConflictInput): Promise<File | INode | null> {\n\tif (isFileSystemFileEntry(input)) {\n\t\treturn await new Promise((resolve, reject) => input.file(resolve, reject))\n\t} else if (isFileSystemEntry(input)) {\n\t\treturn null\n\t}\n\treturn input\n}\n\n/**\n * Get the filesize if available.\n *\n * @param input - The input file or node\n */\nfunction getSize(input: INode | File): number | undefined {\n\treturn input.size\n}\n\n/**\n * Get the mtime if available.\n *\n * @param input - The input file or node\n */\nfunction getMTime(input: INode | File): Date | undefined {\n\tif (input instanceof File) {\n\t\tconst mtime = input.lastModified\n\t\tif (mtime > 0) {\n\t\t\treturn new Date(mtime)\n\t\t}\n\t} else {\n\t\treturn input.mtime\n\t}\n}\n\n/**\n * Get the preview url if possible.\n * For INode the server preview endpoint is used, for files a data URL is generated.\n *\n * @param input - The input file or node\n */\nasync function getPreview(input: INode | File): Promise<string | undefined> {\n\tif (input instanceof File) {\n\t\treturn await getFilePreview(input)\n\t}\n\treturn getPreviewURL(input, { size: PREVIEW_SIZE })?.toString()\n}\n\n/**\n * Get a object url for a local file.\n *\n * @param file - The input file\n */\nasync function getFilePreview(file: File): Promise<string | undefined> {\n\tif (!file.type.startsWith('image/')) {\n\t\treturn undefined\n\t}\n\n\tconst { resolve, promise } = Promise.withResolvers<string | undefined>()\n\tconst reader = new FileReader()\n\treader.onload = async (e) => {\n\t\tconst result = e?.target?.result\n\t\tif (result instanceof ArrayBuffer) {\n\t\t\tconst blob = new Blob([result], { type: file.type })\n\t\t\tconst url = URL.createObjectURL(blob)\n\t\t\tresolve(url)\n\t\t\treturn\n\t\t}\n\t\tresolve(undefined)\n\t}\n\treader.readAsArrayBuffer(file)\n\treturn promise\n}\n\n/**\n * Check the validitiy of the conflict resolution\n */\nfunction validate() {\n\tvalidationMessage.value = !incomingSelected.value && !existingSelected.value\n\t\t? t('You need to choose at least one conflict solution')\n\t\t: ''\n}\n</script>\n\n<template>\n\t<fieldset :class=\"$style.pickerEntry\">\n\t\t<legend>{{ existing.displayname }}</legend>\n\n\t\t<!-- Incoming file -->\n\t\t<NcCheckboxRadioSwitch\n\t\t\tv-model=\"incomingSelected\"\n\t\t\t:error=\"!!validationMessage\"\n\t\t\t:helperText=\"validationMessage\"\n\t\t\t:required=\"!conflictResolved\">\n\t\t\t<span :class=\"$style.pickerEntryItem\">\n\t\t\t\t<!-- Icon or preview -->\n\t\t\t\t<NcIconSvgWrapper\n\t\t\t\t\tv-if=\"!incomingPreview\"\n\t\t\t\t\t:class=\"[$style.pickerEntryIcon, { [$style.pickerEntryIcon_folder]: isExistingFolder }]\"\n\t\t\t\t\t:path=\"isIncomingFolder ? mdiFolder : mdiFile\"\n\t\t\t\t\t:size=\"48\" />\n\t\t\t\t<img\n\t\t\t\t\tv-else\n\t\t\t\t\t:class=\"$style.pickerEntryPreview\"\n\t\t\t\t\t:src=\"incomingPreview\"\n\t\t\t\t\talt=\"\"\n\t\t\t\t\tloading=\"lazy\">\n\n\t\t\t\t<!-- Description -->\n\t\t\t\t<span :class=\"$style.pickerEntryDescription\">\n\t\t\t\t\t<span>\n\t\t\t\t\t\t{{ t('New version') }}\n\t\t\t\t\t</span>\n\t\t\t\t\t<NcDateTime\n\t\t\t\t\t\tv-if=\"incomingMTime\"\n\t\t\t\t\t\t:timestamp=\"incomingMTime\"\n\t\t\t\t\t\t:relativeTime=\"false\"\n\t\t\t\t\t\t:format=\"{ timeStyle: 'short', dateStyle: 'medium' }\" />\n\t\t\t\t\t<span v-else>\n\t\t\t\t\t\t{{ t('Last modified date unknown') }}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span>\n\t\t\t\t\t\t{{ incomingSize }}\n\t\t\t\t\t</span>\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t</NcCheckboxRadioSwitch>\n\n\t\t<!-- Existing file -->\n\t\t<NcCheckboxRadioSwitch\n\t\t\tv-model=\"existingSelected\"\n\t\t\t:error=\"!!validationMessage\"\n\t\t\t:helperText=\"validationMessage\"\n\t\t\t:required=\"!conflictResolved\">\n\t\t\t<span :class=\"$style.pickerEntryItem\">\n\t\t\t\t<!-- Icon or preview -->\n\t\t\t\t<NcIconSvgWrapper\n\t\t\t\t\tv-if=\"!existingPreview\"\n\t\t\t\t\t:class=\"[$style.pickerEntryIcon, { [$style.pickerEntryIcon_folder]: isExistingFolder }]\"\n\t\t\t\t\t:path=\"isExistingFolder ? mdiFolder : mdiFile\"\n\t\t\t\t\t:size=\"48\" />\n\t\t\t\t<img\n\t\t\t\t\tv-else\n\t\t\t\t\t:class=\"$style.pickerEntryPreview\"\n\t\t\t\t\t:src=\"existingPreview\"\n\t\t\t\t\talt=\"\"\n\t\t\t\t\tloading=\"lazy\">\n\n\t\t\t\t<!-- Description -->\n\t\t\t\t<span :class=\"$style.pickerEntryDescription\">\n\t\t\t\t\t<span>\n\t\t\t\t\t\t{{ t('Existing version') }}\n\t\t\t\t\t</span>\n\t\t\t\t\t<NcDateTime\n\t\t\t\t\t\tv-if=\"existingMTime\"\n\t\t\t\t\t\t:timestamp=\"existingMTime\"\n\t\t\t\t\t\t:relativeTime=\"false\"\n\t\t\t\t\t\t:format=\"{ timeStyle: 'short', dateStyle: 'medium' }\" />\n\t\t\t\t\t<span v-else>\n\t\t\t\t\t\t{{ t('Last modified date unknown') }}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span>\n\t\t\t\t\t\t{{ existingSize }}\n\t\t\t\t\t</span>\n\t\t\t\t</span>\n\t\t\t</span>\n\t\t</NcCheckboxRadioSwitch>\n\t</fieldset>\n</template>\n\n<style module lang=\"scss\">\n$height: 64px;\n\n.pickerEntry {\n\t// last fieldset does not have a border\n\t&:not(:last-of-type) {\n\t\tborder-bottom: 1px solid var(--color-border);\n\t}\n}\n\n.pickerEntryItem {\n\tdisplay: flex;\n\talign-items: center;\n\theight: $height;\n}\n\n.pickerEntryIcon,\n.pickerEntryPreview {\n\theight: $height;\n\twidth: $height;\n\tmargin: 0 var(--secondary-margin);\n\tdisplay: block;\n\tflex: 0 0 $height;\n}\n\n.pickerEntryIcon {\n\tcolor: var(--color-text-maxcontrast);\n}\n\n.pickerEntryIcon_folder {\n\tcolor: var(--color-primary-element);\n}\n\n.pickerEntryPreview {\n\toverflow: hidden;\n\tborder-radius: calc(var(--border-radius) * 2);\n\tobject-fit: cover;\n}\n\n.pickerEntryDescription {\n\tdisplay: flex;\n\tflex-direction: column;\n\n\tspan {\n\t\twhite-space: nowrap;\n\t}\n}\n</style>\n","<!--\n  - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport type { INode } from '@nextcloud/files'\nimport type { ConflictInput, ConflictResolutionResult } from '../../conflict-picker.ts'\n\nimport { mdiArrowRight, mdiClose } from '@mdi/js'\nimport { computed, shallowRef, useTemplateRef } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'\nimport NcDialog from '@nextcloud/vue/components/NcDialog'\nimport NcIconSvgWrapper from '@nextcloud/vue/components/NcIconSvgWrapper'\nimport ConflictPickerEntry from './ConflictPickerEntry.vue'\nimport { showError } from '../../toast.ts'\nimport { n, t } from '../../utils/l10n.ts'\nimport { logger } from '../../utils/logger.ts'\n\nconst props = defineProps<{\n\t/**\n\t * Container for the dialog\n\t */\n\tcontainer?: string | undefined\n\n\t/**\n\t * Directory/context file name\n\t */\n\tdirname: string\n\n\t/**\n\t * The existing nodes (same names as the conflicts)\n\t */\n\texisting: INode[]\n\n\t/**\n\t * The incoming nodes with conflicting names compared to `existing`\n\t */\n\tincoming: ConflictInput[]\n\n\t/**\n\t * If set to true no hint about overwriting directory content will be shown\n\t */\n\trecursiveUpload?: boolean\n}>()\n\nconst emit = defineEmits<{\n\tclose: [result: ConflictResolutionResult<ConflictInput> | null]\n}>()\n\nconst blockedTitle = t('You need to select at least one version of each file to continue.')\n\nconst formElement = useTemplateRef('form')\nconst conflictEntries = useTemplateRef('conflictEntry')\n\nconst newSelected = shallowRef<ConflictInput[]>([])\nconst oldSelected = shallowRef<ConflictInput[]>([])\n\nconst isNoNewSelected = computed(() => newSelected.value.length === 0)\nconst areAllNewSelected = computed(() => newSelected.value.length === props.incoming.length)\nconst areSomeNewSelected = computed(() => !areAllNewSelected.value && !isNoNewSelected.value)\nconst areAllOldSelected = computed(() => oldSelected.value.length === props.existing.length)\nconst areSomeOldSelected = computed(() => !areAllOldSelected.value && !isNoNewSelected.value)\nconst areConflictsResolved = computed(() => {\n\tfor (const conflict of props.incoming) {\n\t\tif (oldSelected.value.includes(conflict) || newSelected.value.includes(conflict)) {\n\t\t\tcontinue\n\t\t}\n\t\treturn false\n\t}\n\treturn true\n})\n\nconst dialogName = computed(() => props.dirname?.trim() !== ''\n\t? n('%n file conflict in {dirname}', '%n file conflicts in {dirname}', props.incoming.length, { dirname: props.dirname })\n\t: n('%n file conflict', '%n files conflict', props.incoming.length))\n\n/**\n * Cancel the conflic resolution (closing the dialog)\n */\nfunction onCancel() {\n\temit('close', null)\n}\n\n/**\n * Skip all conflicts (no upload will be performed)\n */\nfunction onSkipAll() {\n\tlogger.debug('Conflict skipped. Ignoring all conflicting files')\n\temit('close', {\n\t\tselected: [],\n\t\trenamed: [],\n\t\tskipped: [...props.incoming],\n\t})\n}\n\n/**\n * @param selected - The toggle state\n */\nfunction onSelectAllNew(selected: boolean) {\n\tif (selected) {\n\t\tlogger.debug('Selected all new files')\n\t\tnewSelected.value = [...props.incoming]\n\t} else {\n\t\tlogger.debug('Cleared new selection')\n\t\tnewSelected.value = []\n\t}\n}\n\n/**\n * @param selected - The toggle state\n */\nfunction onSelectAllOld(selected: boolean) {\n\tif (selected) {\n\t\tlogger.debug('Selected all existing files')\n\t\toldSelected.value = [...props.incoming]\n\t} else {\n\t\tlogger.debug('Cleared old selection')\n\t\toldSelected.value = []\n\t}\n}\n\n/**\n * @param conflict - The conflict that should be skipped\n */\nfunction toggleOldSelected(conflict: ConflictInput) {\n\tif (oldSelected.value.includes(conflict)) {\n\t\toldSelected.value = oldSelected.value.filter((entry) => entry !== conflict)\n\t} else {\n\t\toldSelected.value = [...oldSelected.value, conflict]\n\t}\n}\n\n/**\n * @param conflict - The conflict where the incoming node should be used\n */\nfunction toggleNewSelected(conflict: ConflictInput) {\n\tif (newSelected.value.includes(conflict)) {\n\t\tnewSelected.value = newSelected.value.filter((entry) => entry !== conflict)\n\t} else {\n\t\tnewSelected.value = [...newSelected.value, conflict]\n\t}\n}\n\n/**\n * Handle submit by validating all conflict resolutions\n */\nfunction onSubmit() {\n\tif (!areConflictsResolved.value) {\n\t\tfor (const entry of conflictEntries.value!) {\n\t\t\tentry!.validate()\n\t\t}\n\n\t\tformElement.value!.reportValidity()\n\t\tshowError(blockedTitle)\n\t\treturn\n\t}\n\n\tconst selected = newSelected.value.filter((entry) => !oldSelected.value.includes(entry))\n\tconst renamed = newSelected.value.filter((entry) => oldSelected.value.includes(entry))\n\tconst skipped = oldSelected.value.filter((entry) => !newSelected.value.includes(entry))\n\n\temit('close', {\n\t\trenamed,\n\t\tselected,\n\t\tskipped,\n\t})\n}\n</script>\n\n<template>\n\t<NcDialog\n\t\t:container\n\t\t:class=\"$style.picker\"\n\t\t:name=\"dialogName\"\n\t\tsize=\"large\"\n\t\t@closing=\"onCancel\">\n\t\t<!-- Header -->\n\t\t<div :class=\"$style.pickerHeader\">\n\t\t\t<!-- Description -->\n\t\t\t<p id=\"conflict-picker-description\" :class=\"$style.pickerDescription\">\n\t\t\t\t{{ t('Which files do you want to keep?') }}<br>\n\t\t\t\t{{ t('If you select both versions, the incoming file will have a number added to its name.') }}<br>\n\t\t\t\t<template v-if=\"recursiveUpload\">\n\t\t\t\t\t{{ t('When an incoming folder is selected, the content is written into the existing folder and a recursive conflict resolution is performed.') }}\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t{{ t('When an incoming folder is selected, any conflicting files within it will also be overwritten.') }}\n\t\t\t\t</template>\n\t\t\t</p>\n\t\t</div>\n\n\t\t<!-- Main form and conflict picker -->\n\t\t<form\n\t\t\tref=\"form\"\n\t\t\taria-labelledby=\"conflict-picker-description\"\n\t\t\t:class=\"$style.pickerForm\"\n\t\t\t@submit.prevent.stop=\"onSubmit\">\n\t\t\t<!-- Select all checkboxes -->\n\t\t\t<fieldset :class=\"$style.pickerSelectAll\">\n\t\t\t\t<legend class=\"hidden-visually\">\n\t\t\t\t\t{{ t('Select all checkboxes') }}\n\t\t\t\t</legend>\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t:modelValue=\"areAllNewSelected\"\n\t\t\t\t\t:indeterminate=\"areSomeNewSelected\"\n\t\t\t\t\t@update:modelValue=\"onSelectAllNew\">\n\t\t\t\t\t{{ t('Select all new files') }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t\t<NcCheckboxRadioSwitch\n\t\t\t\t\t:modelValue=\"areAllOldSelected\"\n\t\t\t\t\t:indeterminate=\"areSomeOldSelected\"\n\t\t\t\t\t@update:modelValue=\"onSelectAllOld\">\n\t\t\t\t\t{{ t('Select all existing files') }}\n\t\t\t\t</NcCheckboxRadioSwitch>\n\t\t\t</fieldset>\n\n\t\t\t<!-- Files loop -->\n\t\t\t<ConflictPickerEntry\n\t\t\t\tv-for=\"(node, index) in existing\"\n\t\t\t\tref=\"conflictEntry\"\n\t\t\t\t:key=\"node.fileid\"\n\t\t\t\t:incoming=\"incoming[index]!\"\n\t\t\t\t:existing=\"node\"\n\t\t\t\t:incomingSelected=\"newSelected.includes(incoming[index]!)\"\n\t\t\t\t:existingSelected=\"oldSelected.includes(incoming[index]!)\"\n\t\t\t\t@update:existingSelected=\"toggleOldSelected(incoming[index]!)\"\n\t\t\t\t@update:incomingSelected=\"toggleNewSelected(incoming[index]!)\" />\n\t\t</form>\n\n\t\t<!-- Controls -->\n\t\t<template #actions>\n\t\t\t<!-- Cancel the entire operation -->\n\t\t\t<NcButton\n\t\t\t\t:title=\"t('Cancel the entire operation')\"\n\t\t\t\tdata-cy-conflict-picker-cancel\n\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t@click=\"onCancel\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiClose\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('Cancel') }}\n\t\t\t</NcButton>\n\n\t\t\t<!-- Align right -->\n\t\t\t<span :class=\"$style.pickerActionSeparator\" />\n\n\t\t\t<NcButton @click=\"onSkipAll\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper :path=\"mdiClose\" />\n\t\t\t\t</template>\n\t\t\t\t{{ incoming.length === 1 ? t('Skip this file') : n('Skip %n file', 'Skip %n files', incoming.length) }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\t:aria-disabled=\"!areConflictsResolved\"\n\t\t\t\t:class=\"[\n\t\t\t\t\t$style.pickerActionSubmit,\n\t\t\t\t\t{\n\t\t\t\t\t\t[$style.pickerActionSubmit_disabled]: !areConflictsResolved,\n\t\t\t\t\t},\n\t\t\t\t]\"\n\t\t\t\t:title=\"areConflictsResolved ? '' : blockedTitle\"\n\t\t\t\ttype=\"submit\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\t@click.stop.prevent=\"onSubmit\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<NcIconSvgWrapper directional :path=\"mdiArrowRight\" />\n\t\t\t\t</template>\n\t\t\t\t{{ t('Continue') }}\n\t\t\t\t<span v-if=\"!areConflictsResolved\" class=\"hidden-visually\">{{ blockedTitle }}</span>\n\t\t\t</NcButton>\n\t\t</template>\n\t</NcDialog>\n</template>\n\n<style module lang=\"scss\">\n.picker {\n\t--margin: 36px;\n\t--secondary-margin: 18px;\n}\n\n.pickerHeader {\n\tposition: sticky;\n\tz-index: 10;\n\ttop: 0;\n\tpadding: 0 var(--margin);\n\tpadding-bottom: var(--secondary-margin);\n\tbackground-color: var(--color-main-background);\n}\n\n.pickerForm {\n\tposition: relative;\n\toverflow: auto;\n\tpadding: 0 var(--margin);\n\t// overlap header bottom padding\n\tmargin-top: calc(-1 * var(--secondary-margin));\n}\n\n.pickerActionSubmit_disabled {\n\topacity: 0.7;\n\tfilter: saturate(50%);\n}\n\n.pickerSelectAll {\n\tdisplay: grid;\n\twidth: 100%;\n\tmargin-top: calc(var(--secondary-margin) * 1.5);\n\tpadding-bottom: var(--secondary-margin);\n\tgrid-template-columns: 1fr 1fr;\n\n\tlegend {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\twidth: 100%;\n\t\tmargin-bottom: calc(var(--secondary-margin) / 2);\n\t}\n\n\t&.conflict-picker__all {\n\t\tposition: sticky;\n\t\ttop: 0;\n\t\tmargin: 0;\n\t\tpadding: var(--secondary-margin) 0;\n\t\tbackground-image: linear-gradient(to top, transparent, var(--color-main-background-blur) 10%, var(--color-main-background) 15%);\n\t\t// Proper select all checkboxes alignment\n\t\t& + fieldset {\n\t\t\tmargin-top: 0;\n\t\t}\n\n\t\t:deep(label) {\n\t\t\tfont-weight: bold;\n\t\t}\n\t}\n}\n</style>\n"],"names":["_useModel","_createElementBlock","_normalizeClass","$style","_createElementVNode","_toDisplayString","_createVNode","_unref","_createBlock","_openBlock","_createTextVNode","_Fragment","_renderList"],"mappings":"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"}